【问题标题】:Set date() to midnight in users timezone with moment.js使用 moment.js 在用户时区将 date() 设置为午夜
【发布时间】:2016-07-06 00:02:06
【问题描述】:

我使用 moment.js 在用户本地时区显示 UTC 日期:

var date = new Date(Date.UTC(2016,03,30,0,0,0));
var now = new Date();
var diff = (date.getTime()/1000) - (now.getTime()/1000);

var textnode = document.createTextNode(moment(date).format('dddd, DD.MM.YYYY') + ' a las ' + moment(date).format('HH:mm A'));
document.getElementsByClassName("date")[0].appendChild(textnode.cloneNode(true));

我稍后使用diff 变量来显示倒计时。

我想在当地时区向每个人显示不同的倒计时。 (在他们的时区使用直到午夜的差异,而不是在 UTC)

但我正在努力让它发挥作用。而不是使用var date = new Date(Date.UTC(2016,03,30,0,0,0));,我可能需要使用moment.js的一些功能,它可以让我在用户时区直到午夜。

最好的例子是新年前夜。如果我使用 UTC,每个人都会有相同的计数器(还剩 9 小时),但在世界不同地区,这没有任何意义。对于澳大利亚的人来说应该还有 2 小时,而对于美国的人来说应该是 14 小时。

【问题讨论】:

  • 当你构造你的date 变量时,你明确地调用Date.UTC()。您需要做的就是不使用使用Date.UTC() 构造一个午夜日期,对吗?
  • 谢谢你让我觉得自己很愚蠢;)你是对的……你可能想回答这个问题,这样我才能接受它

标签: javascript date datetime momentjs


【解决方案1】:

我不确定我是否完全理解你的问题,但我会给你一些一般性的建议和技巧。

  1. 使用 moment.js 时,几乎不需要使用 Date 对象。仅将它用于与需要 Date 对象的其他 API 交互。

  2. 要获得 UTC 时间,只需使用 moment.utc(...),传递适当的参数,例如 moment.utc([2016,3,30])moment.utc('2016-04-30') 表示 UTC 4 月 30 日午夜。

  3. 如果要将其转换回用户的本地时间,请使用 .local() 函数。例如,moment.utc('2016-04-30').local() 将创建一个与提供的 UTC 时间等效的本地时间的时刻。

  4. 如果您想要用户本地时间的某个时刻,那么这将是 moment(...),例如 当地时间 4 月 30 日午夜的 moment([2016,3,30])moment('2016-04-30')。 p>

  5. 你可以使用diff函数区分两个矩,它可以给出特定单位的答案,例如m1.diff(m2, 'seconds'),其中m1m2是矩对象。

    李>
  6. 您无需致电format 两次。只需用方括号封装您想要输出的任何文本。 .format('dddd, DD.MM.YYYY [a las] HH:mm A')

  7. 您可能会查看 moment 的语言环境支持。如果我没记错的话,“a las”表示西班牙语,但它不是总是“a las”,但有时是“a la”,如果时间是1。此外,moment 仅在其 .calendar() 函数中使用这些词,例如在生成像 "mañana a las 13:17" 这样的短语时。在西班牙语言环境中使用.format('LLLL') 格式化的常规日期类似于:"sábado, 19 de marzo de 2016 13:17"。因此,您可能需要验证“a las”在每种情况下是否正是您想要的。

  8. 这个问题的标题是如何将日期设置为午夜。为此,我建议使用 moment 的 startOf 函数。 m.startOf('day') 将设置时刻 m 为一天的开始,通常是午夜。请记住,并非每个本地日实际上在每个时区的午夜开始。由于daylight saving time 之类的异常情况,有些日子可能从 1:00 开始。例如,这发生在今年in Brazil on October 16th

    此外,如果您在 UTC 模式下创建了时刻,您可能希望先将其转换回本地模式,然后再将其设置为一天的开始。如果您不想更改原始 moment 对象,请务必先克隆它。

    把这一切放在一起:

    var m1 = moment.utc([2016,3,30]);
    var m2 = m1.clone().local().startOf('day');
    
    var now = moment();
    var diff = m1.diff(now, 'seconds');
    

【讨论】:

  • 这真是太棒了马特,非常感谢。我不知道所有这些细节,因为我第一次只是使用 moment 将 UTC 时间转换为用户本地时间并将其显示在柜台下方。我会更新我的代码,谢谢!
猜你喜欢
  • 2021-10-22
  • 2015-09-02
  • 2014-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-13
  • 2014-11-29
  • 2012-01-11
相关资源
最近更新 更多