【问题标题】:Moment Js UTC to Local Time时刻 Js UTC 到本地时间
【发布时间】:2015-12-09 00:43:30
【问题描述】:

我正在尝试将 UTC 时间转换为本地时间。我一直在通过这个链接关注这个例子:http://jsfiddle.net/FLhpq/4/light/。我似乎无法获得正确的本地输出。例如,如果它的上午 10:30 在这里,而不是得到 10:30 生病得到 15:30。这是我的代码:

var date = moment.utc().format('YYYY-MM-DD HH:mm:ss');

var localTime  = moment.utc(date).toDate();

localTime = moment(localTime).format('YYYY-MM-DD HH:mm:ss');

console.log("moment: " + localTime);

无论我做什么,时间总是在 UTC 时间出现。我住在休斯顿,所以我知道时区是问题所在。我已按照链接中的代码进行操作,但似乎可以获取当地时间。我做错了什么?

【问题讨论】:

    标签: javascript date momentjs


    【解决方案1】:

    要将 UTC 时间转换为本地时间,您必须使用 moment.local()

    更多信息见docs

    示例:

    var date = moment.utc().format('YYYY-MM-DD HH:mm:ss');
    
    console.log(date); // 2015-09-13 03:39:27
    
    var stillUtc = moment.utc(date).toDate();
    var local = moment(stillUtc).local().format('YYYY-MM-DD HH:mm:ss');
    
    console.log(local); // 2015-09-13 09:39:27
    

    演示:

    var date = moment.utc().format();
    console.log(date, "- now in UTC"); 
    
    var local = moment.utc(date).local().format();
    console.log(local, "- UTC now to local"); 
    <script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js"></script>

    【讨论】:

    • 对我不起作用,时间仍然比我的浏览器时间早 5 小时,这是正确的
    • 如果 momentjs 知道本地时区,有没有办法检索它或者是 moment.tz.guess() 需要这样做吗?
    • @jEremyB、moment().format('Z')moment().format('ZZ') 可以帮助您。另外,看看(new Date()).getTimezoneOffset(),也许对你来说已经足够了
    • @brianScroggins,一定不要忘记.utc(date)。在第一部分,var local = ... 没有它可能会产生误导。
    • 我在 nodeJs 环境中使用了 moment,我必须在 environment-vars 中设置时区才能正常工作:TZ='Europe/Vienna' stackoverflow.com/a/9849524/2560683
    【解决方案2】:

    试试这个:

    let utcTime = "2017-02-02 08:00:13";
    
    var local_date= moment.utc(utcTime ).local().format('YYYY-MM-DD HH:mm:ss');
    

    【讨论】:

    • 指定保存它的区域对我有用(这个答案)。此外,发现如果您始终以 utc 格式保存内容然后在客户端格式化,这会让生活变得更轻松。
    • 这适用于我的情况,我们在数据库中保存 UTC 时间,并且只在客户端显示本地时间。谢谢。
    【解决方案3】:
    let utcTime = "2017-02-02 08:00:13.567";
    var offset = moment().utcOffset();
    var localText = moment.utc(utcTime).utcOffset(offset).format("L LT");
    

    试试这个JsFiddle

    【讨论】:

    • 这很好用,但为什么 .local() 不返回相同的结果?
    • 这个小提琴在我的电脑上返回以下结果: 02/02/2017 8:00 AM (UTC Time) 02/02/2017 10:00 AM (Local Time) 02/02/2017 9 :00 AM(当地时间另一种方式)
    【解决方案4】:

    将 UTC 转换为本地时间

    let UTC = moment.utc()
    let local = moment(UTC).local()
    

    或者你想直接获取当地时间

    let local = moment()
    

    var UTC = moment.utc()
    console.log(UTC.format()); // UTC time
    
    var cLocal = UTC.local()
    console.log(cLocal.format()); // Convert UTC time
    
    var local = moment();
    console.log(local.format()); // Local time
    <script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js"></script>

    【讨论】:

      【解决方案5】:

      注意:请相应更新日期格式。

      格式化日期

         __formatDate: function(myDate){
            var ts = moment.utc(myDate);
            return ts.local().format('D-MMM-Y');
         }
      

      格式化时间

        __formatTime: function(myDate){
            var ts = moment.utc(myDate);
            return ts.local().format('HH:mm');
        },
      

      【讨论】:

        【解决方案6】:

        我为从 UTC 到本地时间以及从本地时间到 UTC 的往返编写了这个 Codesandbox。您可以更改时区和格式。享受吧!

        Codesandbox 的完整示例 (DEMO):

        https://codesandbox.io/s/momentjs-utc-to-local-roundtrip-foj57?file=/src/App.js

        【讨论】:

          【解决方案7】:

          这是我使用 Intl api 所做的:

          let currentTimeZone = new Intl.DateTimeFormat().resolvedOptions().timeZone; // For example: Australia/Sydney
          

          这将返回一个时区名称。将此参数传递给以下函数以获取时间

          let dateTime = new Date(date).toLocaleDateString('en-US',{ timeZone: currentTimeZone, hour12: true});
          
          let time = new Date(date).toLocaleTimeString('en-US',{ timeZone: currentTimeZone, hour12: true});
          

          你也可以像这样用时刻格式化时间:

          moment(new Date(`${dateTime} ${time}`)).format('YYYY-MM-DD[T]HH:mm:ss');
          

          【讨论】:

            【解决方案8】:

            这是我看到的老问题,但我并没有真正得到我想要的东西。我有一个没有时区格式的 UTC 日期时间。所以我不得不这样做:

            let utcDatetime = '2021-05-31 10:20:00';
            let localDatetime = moment(utcDatetime + '+00:00').local().format('YYYY-MM-DD HH:mm:ss');
            

            【讨论】:

              【解决方案9】:

              我创建了一个将所有时区转换为当地时间的函数。

              要求:

              1. npm i moment-timezone
              
              function utcToLocal(utcdateTime, tz) {
                  var zone = moment.tz(tz).format("Z") // Actual zone value e:g +5:30
                  var zoneValue = zone.replace(/[^0-9: ]/g, "") // Zone value without + - chars
                  var operator = zone && zone.split("") && zone.split("")[0] === "-" ? "-" : "+" // operator for addition subtraction
                  var localDateTime
                  var hours = zoneValue.split(":")[0]
                  var minutes = zoneValue.split(":")[1]
                  if (operator === "-") {
                      localDateTime = moment(utcdateTime).subtract(hours, "hours").subtract(minutes, "minutes").format("YYYY-MM-DD HH:mm:ss")
                  } else if (operator) {
                      localDateTime = moment(utcdateTime).add(hours, "hours").add(minutes, "minutes").format("YYYY-MM-DD HH:mm:ss")
                  } else {
                      localDateTime = "Invalid Timezone Operator"
                  }
                  return localDateTime
              }
              
              utcToLocal("2019-11-14 07:15:37", "Asia/Kolkata")
              
              //Returns "2019-11-14 12:45:37"
              

              【讨论】:

              • 这对我有用!谢谢!我用 utcToLocal("2019-11-14 07:15:37", moment.tz.guess())
              【解决方案10】:

              这对我有用,但它需要 moment-tz 和 moment。

              const guess = moment.utc(date).tz(moment.tz.guess());
              const correctTimezone = guess.format()

              【讨论】:

                猜你喜欢
                • 2018-11-17
                • 2018-08-21
                • 2014-09-26
                • 1970-01-01
                • 2021-03-09
                • 2013-08-26
                • 1970-01-01
                • 2011-08-13
                • 2015-07-26
                相关资源
                最近更新 更多