代码之家  ›  专栏  ›  技术社区  ›  βγι Robert Longson

在本地时区从毫秒开始创建moment.js日期

  •  0
  • βγι Robert Longson  · 技术社区  · 6 年前

    我从服务器得到的响应是“本地”时间戳。 这意味着我的本地时间以UTC毫秒表示,但没有UTC偏移量。

    例如: 1537747200000 Mon Sep 24 2018 00:00:00 UTC Mon Sep 24 2018 03:00:00 EEST (my local time) 但是在我看来,这个日期实际上是 Mon Sep 24 2018 00:00:00 EEST ,所以我的时区是UTC值。

    如果需要的话,我现在想用时刻和时刻时区来显示这个。

    所以我想知道的是如何创建一个新的时刻对象 "LOCAL milliseconds"? 如果需要的话,我会通过1537747200000和我的本地时区,我可以把它显示为 2018年9月24日周一00:00:00欧洲东部时间


    我发现使用Moment Timezone+Utcoffset可以达到这个目的,但我不知道这是否是一个好方法。 utc offset docs says this:

    通过提供分钟设置UTC偏移量。请注意,一旦设置了偏移量,它是固定的,不会自行更改(即没有DST规则)。如果你想要一个实际的时区——在一个特定地点的时间,比如美国/洛杉矶,考虑一下时刻时区。


    另一种方法是将力矩格式化为isoString moment(1537747200000).toISOString() 然后分析得到的字符串,不包含时区信息(“z”)。分析字符串时,可以在另一个时区分析它。 moment.tz(moment(1537747200000).toISOString().slice(0, -1), tz) . 但这需要我解析->格式->解析值,因此需要进行大量的额外操作。


    const [one, two, thr] = ["exp","tr","appr"];
    const display = (toAdd, id) => document.getElementById(id).innerHTML += `<br/> ${toAdd}`;
    
    
    const formatString = "MMM D, YYYY HH:mm z";
    const tz = moment.tz.guess();
    const millis_24_sep_00_00_utc = moment.utc("24-09-2018", "DD-MM-YYYY", true).valueOf(); //1537747200000
    const isoString = moment(millis_24_sep_00_00_utc).toISOString();
    
    //exp
    display(tz, one);
    display(millis_24_sep_00_00_utc, one);
    const ex = moment.tz(millis_24_sep_00_00_utc, tz).utc().format("MMM D, YYYY HH:mm")
    display(`${ex} ${moment().tz(tz).zoneAbbr()} <- local tz`, one);
    
    //tr
    [
      moment(millis_24_sep_00_00_utc).tz(tz),
      moment.utc(new Date(millis_24_sep_00_00_utc)).tz(tz),
      moment.tz(millis_24_sep_00_00_utc, tz).utc(),
      moment.tz(isoString, tz),
    ]
    .forEach(mom => display(mom.format(formatString), two));
    
    //some approaches
    [
    //setting utcOffset to 0
      moment.tz(millis_24_sep_00_00_utc, tz).utcOffset(0),
    //iso string to transform millis -> string -> parse the string in another tz
      moment.tz(isoString.slice(0, -1), tz),
    ]
    .forEach(mom => display(mom.format(formatString), thr));
    <!DOCTYPE html>
    <html>
    
    <head>
      <script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.19.1/moment.min.js"></script>
      <script src="https://cdnjs.cloudflare.com/ajax/libs/moment-timezone/0.5.21/moment-timezone-with-data.js"></script>
      <title>Test</title>
    </head>
    <body>
     <div id="exp">EXPECTED</div>
     <hr/>
     <div id="tr">TRIES</div>
     <hr/>
     <div id="appr">APPROACHES</div>
    </body>
    
    </html>
    1 回复  |  直到 6 年前
        1
  •  0
  •   RobG    6 年前

    提供已被偏移的毫秒时间值是不寻常的。但是,如果时间值被+3小时抵消,那么可以减去3小时的毫秒值(1.08e7),并将其用作UTC时间值。

    例如,时间值1537747200000通常表示2018-09-24t00:00:00.000z。如果该时间值实际表示2018-09-24t00:00:00.000+0300,则等效的UTC时间值为:

    1537747200000 - 1.08e7 = 1537736400000;
    

    工作示例:

    var d = new Date(1537747200000 - 1.08e7);
    console.log(`Zulu: ${d.toISOString()}\nLocal: ${d.toString()}`);