【问题标题】:How to detect day light saving and convert to BST (local time) in moment js如何在时刻 js 中检测夏令时并转换为 BST(当地时间)
【发布时间】:2016-04-27 15:52:23
【问题描述】:

我正在做一个项目,突然发现一个问题。问题是,服务器正在发送 GMT 的 Unix 时间戳,但由于夏令时日期 填充为 GMT。它可以从服务器端实现,但有一种非常简单的方法可以将其转换为本地时区(在我的情况下为 GMT 到 BST)

创建三个变量

  1. getPerfectLocalTime
  2. 你的Unix时间戳
  3. 你的格式

下面是逻辑,你可以使用

var GMTtime  = moment(yourUnixTimestamp*1000).format('YYYY-MM-DD HH:mm:ss'); // It should be YYYY-MM-DD format
var convertToUtc = moment.utc(GMTtime).format('YYYY-MM-DD HH:mm:ss');
var localTimeToDate  = moment.utc(convertToUtc).toDate();

var isDSTDateTime = moment(GMTtime, 'YYYY-MM-DD');
var month = isDSTTime.format('M');
var day   = isDSTTime.format('D');
var year  = isDSTTime.format('YYYY');
if(moment([year, month, day]).isDST()){
	getPerfectLocalTime = moment(localTimeToDate).format(yourFormat);
}else {
	getPerfectLocalTime = moment(yourUnixTimestamp*1000).format(yourFormat);
}

希望它能对编程世界的任何人有所帮助:)

【问题讨论】:

  • 这里有问题吗?如果这是您的要求,我可以大大简化您的代码..
  • 实际上,这里的计算是错误的。一般来说,当您发现自己在解析和格式化的过程中跳来跳去时,您可能做错了。
  • 嗨,马特,感谢您的回复。这实际上不是一个问题。这只是一个帖子,可以帮助想要使用它的人。很抱歉,它对我来说很完美。太好了,如果你能告诉我哪里错了,我可以纠正它。谢谢
  • 您的计算错误的主要原因是您没有考虑传递给时刻构造函数的数组中的月份为 0-11。您还假设您应该将本地时间用于 DST,将 UTC 用于标准时间,但这是完全错误的 - 它仅适用于伦敦,因为 BST 为 +1。它会在其他时区失败。此外,这对于想要的效果来说太过分了。

标签: javascript angularjs momentjs angular-moment


【解决方案1】:

鉴于您的示例中唯一的输入是yourUnixTimestamp,并且您乘以 1000,我假设这是一个传统的 Unix 时间戳 - 自 1970 年 1 月 1 日午夜以来的整数秒数世界标准时间。

只需调用moment.unix 即可解析这种特定类型的输入值。生成的 moment 对象已经处于本地模式,因此您可以直接对其进行格式化。

moment.unix(yourUnixTimestamp).format(yourFormat)

如果您想知道当地时区的夏令时是否有效,您也可以直接询问。

moment.unix(yourUnixTimestamp).isDST()

但请注意,您无需知道这一点即可正确格式化时间。 Moment 已经在内部考虑了这一点。

【讨论】:

    猜你喜欢
    • 2019-03-13
    • 1970-01-01
    • 2016-07-15
    • 2020-09-16
    • 1970-01-01
    • 2014-04-25
    • 2012-02-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多