我使用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个小时。

最佳答案

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

  • 在使用moment.js时,几乎不需要使用Date对象。仅将其用于与需要Date对象的其他API进行交互。
  • 要在UTC上花费片刻,只需使用moment.utc(...),并传递适当的参数,例如UTC 4月30日午夜的moment.utc([2016,3,30])moment.utc('2016-04-30')
  • 如果要将其转换回用户的本地时间,请使用.local()函数。例如,moment.utc('2016-04-30').local()将创建一个具有与提供的UTC时间等效的本地时间的时刻。
  • 如果您想在用户的本地时间中停留片刻,则应为moment(...),例如本地时间4月30日午夜的moment([2016,3,30])moment('2016-04-30')
  • 您可以使用diff函数区分两个矩,该函数可以特定单位给出答案,例如m1.diff(m2, 'seconds'),其中m1m2是矩对象。
  • 您不需要两次调用format。只需用方括号封装要输出的任何文本。 .format('dddd, DD.MM.YYYY [a las] HH:mm A')
  • 您可能会考虑一下瞬间的语言环境支持。如果我没记错的话,“la las”表示西类牙语,但是如果小时数是1,则它并不总是“las las”,但有时也表示“la la”。另外,moment只在其.calendar()函数中使用这些单词,例如在生成类似"mañana a las 13:17"的短语时。在西类牙语言环境中使用.format('LLLL')格式化的常规日期将类似于:"sábado, 19 de marzo de 2016 13:17"。因此,您可能想验证在每种情况下“las”正是您想要的。
  • 这个问题的标题是如何将日期设置为午夜。为此,我建议使用moment的startOf函数。 m.startOf('day')将设置m时刻为一天的开始,通常是午夜。请记住,并不是每个本地日期实际上都是在每个时区的午夜开始的。由于daylight saving time之类的异常,某些日子可能从1:00开始。例如,今年发生in Brazil on October 16th

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

    全部放在一起:
    var m1 = moment.utc([2016,3,30]);
    var m2 = m1.clone().local().startOf('day');
    
    var now = moment();
    var diff = m1.diff(now, 'seconds');
    
  • 10-05 20:41
    查看更多