公司的项目是面向海外用户的,但是最初的设计没考虑到时差问题,存入数据库的时间都是东八区的时间,导致现在补救有点坑爹......

有一个需求是,产品详细页需要注明此款产品的开售时间,当海外的用户来访问这个页面时,不应该显示的是东八区的时间,而应该显示当地时区对应的时间。

.net的类库里没有获取客户端当地时区的方法的,比如ToLocalTime(),获取的是服务器的时间,TimeZoneInfo里的一些方法,都是正向转化,必须提供已知的时区编号,时区名称等条件,但这些不是已知时,都是白搭。

查询了资料,发现只能从JS入手,看到有两种解决方案,一种是用ajax传到服务端进行处理,第二种是设置cookie在服务端获取再处理,如果不是大批量的数据呈现,感觉有点麻烦,之后自己写了一个方法,具体方案就是从后台读取的时间,先从前台的JS里转化,再呈现到页面上,具体看业务需求。

直接提供JS方法吧,如有什么不对的地方可以提出来:

/*
* 根据日期写入时所在的时区号,传化为客户端所在时区的时间
* 东:负数,西:正数
* Create Date:2016-01-27 By Harry
*/
Date.prototype.ToLocalTimeByZoneNum = function (zoneNum) {
if (isNaN(zoneNum))
zoneNum = 0;
this.setHours(this.getHours() + zoneNum);//转化时间为UTC时间
var clientTime = new Date();//客户端当前时间
var offset = Math.floor(clientTime.getTimezoneOffset() * 60000)//客户端时间与UTC时间的偏移量(毫秒)
this.setTime(this.getTime() - offset);//根据偏移量计算传入时间在客户端所在时区的对应时间
return this;
}
//默认传入东八区
Date.prototype.ToLocalTime = function () {
this.ToLocalTimeByZoneNum(-8)
return this;
}
/*
* 转化成国外常用显示格式
* 1:Mon Feb 01 2016 12:00:00
* 2:Mon Feb 01 2016
* 3:Feb 01 2016
* 4:Feb 01,2016
* Create Date:2016-01-28 By Harry
*/
Date.prototype.ToGlobalTime = function (type) {
var _date = this.ToLocalTime().toString();
switch (type) {
case 1:
return _date.substring(0, 25); //_date.indexOf('G')
break;
case 2:
return _date.substring(0, 16)
break;
case 3:
return _date.substring(3, 16)
break;
case 4:
return _date.substring(3, 16).replace(/(.{7})/, "$1\n,");
break;
default:
return this;
break;
}
} 附加两个拓展方法,网上搜来的
// 对Date的扩展,将 Date 转化为指定格式的String
// 月(M)、日(d)、小时(h)、分(m)、秒(s)、季度(q) 可以用 1-2 个占位符,
// 年(y)可以用 1-4 个占位符,毫秒(S)只能用 1 个占位符(是 1-3 位的数字)
// Example: (new Date()).Format("yyyy-MM-dd hh:mm:ss.S") ==> 2006-07-02 08:09:04.423
Date.prototype.Format = function (fmt) {
var o = {
"M+": this.getMonth() + 1, //月份
"d+": this.getDate(), //日
"H+": this.getHours(), //小时
"m+": this.getMinutes(), //分
"s+": this.getSeconds(), //秒
"q+": Math.floor((this.getMonth() + 3) / 3), //季度
"S": this.getMilliseconds() //毫秒
};
if (/(y+)/.test(fmt))
fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length));
for (var k in o)
if (new RegExp("(" + k + ")").test(fmt))
fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
return fmt;
}
/**
* 更改日期
* y年, m月, d日, h小时, n分钟,s秒
* Example: new Date().Add("d",-1)
*/
Date.prototype.Add = function (part, value) {
value *= 1;
if (isNaN(value)) {
value = 0;
}
switch (part) {
case "y":
this.setFullYear(this.getFullYear() + value);
break;
case "m":
this.setMonth(this.getMonth() + value);
break;
case "d":
this.setDate(this.getDate() + value);
break;
case "h":
this.setHours(this.getHours() + value);
break;
case "n":
this.setMinutes(this.getMinutes() + value);
break;
case "s":
this.setSeconds(this.getSeconds() + value);
break;
default:
}
}
作者:Harry
本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接.

用JS将指定时间转化成用户当地时区的时间的更多相关文章

  1. js把其他类型转化成字符串

    js把其他类型转化成字符串 一.总结 一句话总结:类型转换中的强制类型转换分为类型转换函数和类型名强制.js后一种和其它语言不同,是类型类的构造方法.String() 二.js把其他类型转化成字符串 ...

  2. C语言获取系统当前时间转化成时间字符串

    因为保存的文件须要加上保存的时间,所以须要一个函数来将系统当前时间获取出来,同一时候转换成时间字符串.详细的时间代码例如以下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ...

  3. js把json数据转化成树形数据

    /*转化函数*/ function(data, attributes) { let resData = data; let tree = []; for(let i = 0; i < resDa ...

  4. 2.js将Date对象转换成“2018-05-10”字符串格式化的时间

    //拼接0 $cms.joint0 = function(val) { if (val < 10) return "0"+val; return val; } //时间格式化 ...

  5. [转]使用js把Unix时间戳转化成普通日期

    本文转自:https://blog.csdn.net/maggie_live/article/details/80606846 方法一: var time = 1523141099;var unixT ...

  6. js将UTC时间转化为当地时区时间

    js将UTC时间转化为当地时区时间(UTC转GMT)   我们在进行网站开发的时候有可能会涉及到国外的用户或者用户身在国外,这时就会存在时差问题,比如说我们在中国的时间是08:00,但是此时韩国的时间 ...

  7. js将UTC时间转化为当地时区时间(UTC转GMT)

    我们在进行网站开发的时候有可能会涉及到国外的用户或者用户身在国外,这时就会存在时差问题,比如说我们在中国的时间是08:00,但是此时韩国的时间是09:00,如果在网页上需要进行相关显示的话就会出现问题 ...

  8. js中对象转化成字符串、数字或布尔值的转化规则

    js中对象可以转化成 字符串.数字.布尔值 一.对象转化成字符串: 规则: 1.如果对象有toString方法,则调用该方法,并返回相应的结果:(代码通常会执行到这,因为在所有对象中都有toStrin ...

  9. kibana 显示 @timestamp 时间问题(utc or browser当前时间)自动转换显示

    https://github.com/elasticsearch/kibana/issues/95

随机推荐

  1. centos添加永久的环境变量

    cd /etc/profile.d/ 创建一个sh文件 vi dotnetpath.sh 内容如下: export PATH=$PATH:/opt/dotnet 保存,重启,这就有了一个永久的环境变量

  2. (Entity framework 应用篇)把权限判断封装在数据库访问层

    这里,我只是以一个例子,说一下简单权限控制,通过这个例子,大家可以设计庞大的权限管理层,把权限控制封装到数据库访问层,这样程序员就不用再写权限判断的代码了 首先,先看看我数据库DBContext的定义 ...

  3. csrf漏洞利用

    low csrf(cross-site-request forgery),跨站请求伪造. 测试网站 --http://localhost/vulnerability/csrf 修改密码,点击chang ...

  4. Django - 一对多跨表操作

    1.views.py 2.host.html 运行结果: 通过外键,来进行多表取值(多表取值包括后台取值及前端获取): 多表获取数据时,可以通过以下几种方式实现: 1.从query  set 中获取某 ...

  5. SQL上门2

    SQL高级教程学习 MySQL的字符匹配和其他数据库不同,一下语句查找(第一个字符不是h,第三个字符是m)不能用“!” select * from country where countryname ...

  6. LINQ简记(3):子句

    LINQ查询表达式的子句如select,where,from等都是比较简单的子句,相信各位多练习练习,再结合MSDN的例子,基本上是可以理解的,因此,本文只挑几个有代表性的,以及有些难理解的子句来简述 ...

  7. BZOJ 1452 Count 【模板】二维树状数组

    对每种颜色开一个二维树状数组 #include<cstdio> #include<algorithm> using namespace std; ; ][maxn][maxn] ...

  8. ubuntu添加开机自启和sysv-rc-conf

    此文ubuntu使用sysvinit,而非upstart UBUNTU添加开机自动启动程序方法 1. 开机启动时自动运行程序    Linux加载后, 它将初始化硬件和设备驱动, 然后运行第一个进程i ...

  9. VNC Server Installation on CentOS 6.5

    In my case I have a fresh installed CentOS6.5 Server on which I will be installing the VNC-server so ...

  10. Hibernate数据缓存攻略

    目录 第一章 缓存策略概述 第二章 hibernate不使用缓存的问题 第三章 一级缓存介绍 第四章 二级缓存 第五章 一二级缓存对比及总结 源代码: https://github.com/weili ...