Javascript 使用moment.js将用户时区中的date()设置为午夜

Javascript 使用moment.js将用户时区中的date()设置为午夜,javascript,date,datetime,momentjs,Javascript,Date,Datetime,Momentjs,我使用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.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=新日期(date.UTC(2016,03,30,0,0))我可能需要使用moment.js的一些函数,它可以让我在用户时区一直到午夜


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

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

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

  • 要获得UTC中的时刻,只需使用
    矩.UTC(…)
    ,传递适当的参数,例如
    矩.UTC([2016,3,30])
    矩.UTC('2016-04-30')
    ,适用于UTC 4月30日午夜

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

  • 如果您希望在用户的本地时间中有一个时刻,那么这将是
    时刻(…)
    ,例如当地时间4月30日午夜的
    时刻([2016,3,30])
    时刻('2016-04-30')

  • 您可以使用
    diff
    功能区分两个力矩,该功能可以以特定单位给出答案,例如
    m1.diff(m2,'秒')
    ,其中
    m1
    m2
    是力矩对象

  • 您不需要调用
    format
    两次。只需用方括号封装您想要输出的任何文本
    .format('dddddd,DD.MM.YYYY[a las]HH:MM a')

  • 您可以研究一下moment的区域设置支持。如果我没弄错的话,“a las”表示西班牙语,但它并不总是“a las”,而是有时“a la”,如果时间是
    1
    。此外,moment只在其
    .calendar()
    函数中使用这些单词,例如在生成类似
    的短语“mañana a las 13:17”
    时。在西班牙地区,用
    .format('LLLL')
    格式化的常规日期类似于:
    “萨巴多,19 de marzo de 2016 13:17”
    。因此,您可能需要验证“las”在任何情况下都是您想要的

  • 这个问题的题目是如何把日期定在午夜。为此,我建议使用矩的
    startOf
    函数
    m.startOf('day')
    将设置从
    m
    开始一天的时刻,通常是午夜。请记住,并不是每个当地的一天都是在每个时区的午夜开始的。由于异常情况,例如,某些天可能从1:00开始。例如,这发生在今年

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

    综上所述:

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

  • 构造
    date
    变量时,显式调用
    date.UTC()
    。你所需要做的就是构造一个午夜日期,而不使用
    date.UTC()
    对吗?谢谢你让我觉得自己很愚蠢;)你说得对……你可能想回答这个问题,这样我就可以接受了。这真是太棒了,马特,非常感谢。我并没有意识到所有这些细节,因为我第一次只是利用这个时刻将UTC时间转换为用户本地时间,并将其显示在计数器下面。我会更新我的代码,谢谢!