当前位置: 首页 > 面试题库 >

如何忽略用户的时区并强制Date()使用特定的时区

冀景明
2023-03-14
问题内容

在一个JS应用程序中,我1270544790922从服务器(Ajax)收到时间戳(等价)。

基于该时间戳,我Date使用以下对象创建对象:

var _date = new Date();
_date.setTime(1270544790922);

现在,_date解码当前用户区域设置时区中的时间戳。我不要

我想_ date将这个时间戳转换为欧洲赫尔辛基市的当前时间(不考虑用户的当前时区)。

我怎样才能做到这一点?


问题答案:

Date对象的基础值实际上是UTC。为了证明这一点,请注意,如果您键入内容new Date(0),则会看到类似:的信息Wed Dec 31 196916:00:00 GMT-0800 (PST)。GMT中将0视为0,但.toString()方法显示本地时间。

重要说明,UTC代表 世界 时码。当前在2个不同位置的当前时间是相同的UTC,但是输出的格式可以不同。

我们需要的是一些格式

var _date = new Date(1270544790922); 
// outputs > "Tue Apr 06 2010 02:06:30 GMT-0700 (PDT)", for me
_date.toLocaleString('fi-FI', { timeZone: 'Europe/Helsinki' });
// outputs > "6.4.2010 klo 12.06.30"
_date.toLocaleString('en-US', { timeZone: 'Europe/Helsinki' });
// outputs > "4/6/2010, 12:06:30 PM"

这行得通,但是…您不能真正将其他任何日期方法用于您的目的,因为它们描述了用户的时区。您需要的是与赫尔辛基时区相关的日期对象。此时,您的选择是使用某些3rd
party库(我建议这样做),或修改date对象,以便您可以使用大多数方法。

选项1-第三方,例如moment-timezone

moment(1270544790922).tz('Europe/Helsinki').format('YYYY-MM-DD HH:mm:ss')
// outputs > 2010-04-06 12:06:30
moment(1270544790922).tz('Europe/Helsinki').hour()
// outputs > 12

这看起来比我们接下来要做的要优雅得多。

选项2-修改日期对象

var currentHelsinkiHoursOffset = 2; // sometimes it is 3
var date = new Date(1270544790922);
var helsenkiOffset = currentHelsinkiHoursOffset*60*60000;
var userOffset = _date.getTimezoneOffset()*60000; // [min*60000 = ms]
var helsenkiTime = new Date(date.getTime()+ helsenkiOffset + userOffset);
// Outputs > Tue Apr 06 2010 12:06:30 GMT-0700 (PDT)

它仍然认为它是GMT-0700(PDT),但是如果您不太凝视,则可能会误认为这是对您有用的日期对象。

我方便地跳过了一部分。您需要能够定义currentHelsinkiOffset。如果可以date.getTimezoneOffset()服务器端使用,或者仅使用一些if语句来描述时区更改的时间,那应该可以解决您的问题。

结论 -我认为,为此目的,您尤其应使用类似moment-timezone的日期库。



 类似资料:
  • 我最近在Android Studio中为我的Android项目添加了一个自定义字体(遵循这些说明)。这不是一个显示文本的常规字体,而是一个包含大量图标的自定义字体,在我的应用程序中使用。 这个很管用。然而,现在一些用户报告了这个问题,他们的设备上只有一些图标可以使用,而许多其他图标显示为字符。所有用户的共同点是,他们在设备设置中配置了一个自定义的FONT/主题,这似乎覆盖了应用程序的样式。因此,应

  • 问题内容: 有没有更好的方法来忽略Angularjs中的时区: “ 2014-01-18 14:30:00”而不是“ 2014-01-18 15:30:00” http://jsfiddle.net/samibel/2rMXJ/ 问题答案: 这是一个例子: 只需管道另一个过滤器: 在您的模板中:

  • 我目前正在验证生成的Excel工作表是否包含正确呈现的“时间戳”,其日期和时间部分位于单独的单元格中,其格式由区域设置调整。 我的测试用例失败了,因为当我从字符串中读回Excel工作表的时间时,不知何故夏令时似乎被忽略了。 以下是我的Java代码:

  • 我正在Debian8上使用PHP5.6.17。在建立owncloud之后,我注意到owncloud(而不是apache)自写的日志有错误的时区。 我调查了一下,好像,那一行: 这不关心任何时区设置。而不是欧洲/柏林(+1/+2)的时间,我总是得到UTC的时间。 在中,我设置了并且系统时间(debian)也是正确的。 即使运行如下所示,也会得到相同的输出(UTC): 对这个问题有什么想法吗?

  • 问题内容: Web服务器是否可以通过标准方法确定网页中用户的时区? 也许来自HTTP标头或user-agent字符串的一部分? 问题答案: 该方法将从GMT中减去您的时间,并返回分钟数。因此,如果您住在GMT-8,它将返回480。 要将其乘以小时,除以60。此外,请注意,该符号与您需要的符号相反-它是计算GMT与您所在时区的偏移量,而不是您所在时区与GMT的偏移量。要解决此问题,只需乘以-1。 由

  • 我试图设置一个作业在一个用户使用Quartz的时区的特定时间的单一执行。现在,开箱即用,告诉调度器执行时区中的任何内容的唯一方法是通过。对于Coors,我可能会将datetime转换为cron表达式,然后在第一次成功执行后立即停止触发器,但这有点难闻。 谢谢,