【问题标题】:Convert UTC Epoch to local date将 UTC 纪元转换为本地日期
【发布时间】:2011-06-05 15:20:41
【问题描述】:

我已经为此奋斗了一段时间。我正在尝试将纪元转换为日期对象。纪元以 UTC 格式发送给我。每当你通过new Date() 一个纪元时,它假定它是本地纪元。我尝试创建一个 UTC 对象,然后使用 setTime() 将其调整到正确的纪元,但似乎唯一有用的方法是 toUTCString() 并且字符串对我没有帮助。如果我将该字符串传递给一个新日期,它应该会注意到它是 UTC,但它不是。

new Date( new Date().toUTCString() ).toLocaleString()

我的下一个尝试是尝试获取本地当前纪元和 UTC 当前纪元之间的差异,但我也无法得到。

new Date( new Date().toUTCString() ).getTime() - new Date().getTime()

它只给我非常小的差异,低于 1000,以毫秒为单位。

有什么建议吗?

【问题讨论】:

  • 纪元时间定义为自 1970 年日期UTC 以来经过的毫秒数。没有地方时代这样的东西!不确定我是否理解您的问题。
  • 可能是电脑上的时区不正确,导致UTC值不同?
  • 如果您想在使用 toLocaleString() 时“查看”UTC 时间,则必须将时钟设置为 UTC 时间。午夜 UTC 是美国东部标准时间晚上 7 点。如果你使用 new Date().toString() 而不是 localeString 你会得到类似:'Fri Jan 07 2011 07:00:00 GMT-0500',其中包括偏移量。
  • 纪元单位是秒,不是毫秒。

标签: javascript date utc epoch


【解决方案1】:

编辑

var utcDate = new Date(incomingUTCepoch);
var date = new Date();
date.setUTCDate(utcDate.getDate());
date.setUTCHours(utcDate.getHours());
date.setUTCMonth(utcDate.getMonth());
date.setUTCMinutes(utcDate.getMinutes());
date.setUTCSeconds(utcDate.getSeconds());
date.setUTCMilliseconds(utcDate.getMilliseconds());

编辑已修复

【讨论】:

  • 我在第二个例子中经历了这个。它给我的差异在 50 到 900 之间,以毫秒为单位(显示处理计算期间的时间,而不是实际差异)
  • 他们都没有帮助我。他们缺少一个 setUTCTime 方法,这将是完美的:P w3schools.com/jsref/jsref_obj_date.asp
  • 不起作用,至少在 Firefox for Ubuntu 上是这样。代码不应在设置日期后设置日/月/年。
  • @Simon Kozlov 实际上这是日期对象中的错误假设,setDate 和 getDate 指的是月份中的日期,问题是我使用了不存在的 (setUTCDay) 之类的函数,很惊讶它被接受了!
  • @AmjadMasad 如果您还显示预期的输出,您的回答会更有帮助。
【解决方案2】:

您只是要求将 UTC 字符串转换为“本地”字符串吗?你可以这样做:

var utc_string = '2011-09-05 20:05:15';
var local_string = (function(dtstr) {
    var t0 = new Date(dtstr);
    var t1 = Date.parse(t0.toUTCString().replace('GMT', ''));
    var t2 = (2 * t0) - t1;
    return new Date(t2).toString();
})(utc_string);

【讨论】:

    【解决方案3】:

    @Amjad,好主意,但更好的实现是:

    Date.prototype.setUTCTime = function(UTCTimestamp) {
        var UTCDate = new Date(UTCTimestamp);
        this.setUTCFullYear(UTCDate.getFullYear(), UTCDate.getMonth(), UTCDate.getDate());
        this.setUTCHours(UTCDate.getHours(), UTCDate.getMinutes(), UTCDate.getSeconds(), UTCDate.getMilliseconds());
        return this.getTime();
    }
    

    【讨论】:

      【解决方案4】:

      我想我有一个更简单的解决方案——将初始日期设置为纪元并添加 UTC 单位。假设您有一个以秒为单位存储的 UTC 纪元变量。 1234567890 怎么样。要将其转换为当地时区的正确日期:

      var utcSeconds = 1234567890;
      var d = new Date(0); // The 0 there is the key, which sets the date to the epoch
      d.setUTCSeconds(utcSeconds);
      

      d 现在是设置为Fri Feb 13 2009 18:31:30 GMT-0500 (EST) 的日期(在我的时区)

      【讨论】:

      • FWIW,日期对象可以用毫秒初始化。所以,var d = new Date(utcSeconds * 1000) 应该产生相同的结果。
      • var d = new Date(1234567890000) 返回相同的结果
      • 想也许其他人可以从几个方面得到一些清晰的信息:日期对象没有设置“标记在其中”的时区。认为它只是一个数字。该数字是自 1970 年 1 月 1 日 UTC 到现在的毫秒数(现在也在 UTC 中)。因此,无论何时创建日期对象,它实际上都是在幕后使用 UTC。 2. 要显示该日期,您可以将其显示为语言环境设置(toLocaleString() 或 UTC(toUTCString())。您不需要自己转换任何内容。使用 utc 毫秒构造,一切都好。使用构造字符串 - 只要它在本地时区。
      • 1234567890000 被视为与 1234567890 相同,也就是 Y39K 问题...
      • @muttonUp,1000 次乘法它有效。但是,“Y39K 问题”谷歌没有给出任何有效的结果。任何 URL 都会有帮助
      【解决方案5】:
       function ToLocalDate (inDate) {
          var date = new Date();
          date.setTime(inDate.valueOf() - 60000 * inDate.getTimezoneOffset());
          return date;
      }
      

      【讨论】:

      • 你成就了我的一天。泰。我刚刚用加号代替了减号。
      【解决方案6】:

      纪元时间从 1970 年 1 月 1 日开始以 秒 为单位。date.getTime() 从 1970 年 1 月 1 日开始返回 毫秒,所以.. 如果你有纪元时间戳, 通过乘以 1000 将其转换为 javascript 时间戳。

         function epochToJsDate(ts){
              // ts = epoch timestamp
              // returns date obj
              return new Date(ts*1000);
         }
      
         function jsDateToEpoch(d){
              // d = javascript date obj
              // returns epoch timestamp
              return (d.getTime()-d.getMilliseconds())/1000;
         }
      

      【讨论】:

      • 想知道到底发生了什么。很高兴知道 epochTime !== javascriptTime 在日期解析方面。谢谢!
      【解决方案7】:

      仅针对日志,我使用Moment.js 库执行此操作,无论如何我都使用该库进行格式化。

      moment.utc(1234567890000).local()
      >Fri Feb 13 2009 19:01:30 GMT-0430 (VET)
      

      【讨论】:

      • Moment 很好,但是使用 1.3MB 的库将一个纪元转换为日期是很疯狂的。难怪有这么多臃肿的节点应用程序。
      • 我的意思是,他确实明确指出他正在使用它进行格式化。在这里这么说不公平。
      【解决方案8】:

      这很简单,new Date() 只需几毫秒,例如

      new Date(1394104654000)
      > Thu Mar 06 2014 06:17:34 GMT-0500 (EST)
      

      【讨论】:

      • 不错的一个!这应该被视为真正接受的答案。
      • 这个对我不起作用,当你有时间戳但使用 utc 纪元时你必须手动设置 utcseconds,接受答案是正确的答案
      • 这是一个合适的答案。新日期可能需要几毫秒,因此只需乘以 1000:const d = new Date(epoch * 1000)。
      • @sameerali 也许您的系统有一些不同的问题,或者您感到困惑。这个答案是正确的答案。 Unix 纪元的定义:自 1 月 1 日午夜 UTC 以来经过的秒数。只需乘以 1000 即可得到经过的毫秒数。
      • 这有记录吗?
      【解决方案9】:

      考虑到,您有 epoch_time 可用,

      // for eg. epoch_time = 1487086694.213
      var date = new Date(epoch_time * 1000); // multiply by 1000 for milliseconds
      var date_string = date.toLocaleString('en-GB');  // 24 hour format
      

      【讨论】:

      【解决方案10】:

      如果您更喜欢在不使用像 moment.js 之类的库的情况下解决往返于 UTC 和本地时间的时间戳和日期转换,请查看以下选项。

      对于使用 UTC 时间戳的应用程序,您可能需要在浏览器中显示日期,同时考虑当地时区和夏令时(如果适用)。即使在同一时区,编辑处于不同夏令时的日期也可能很棘手。

      下面的 Number 和 Date 扩展允许您在时间戳的时区中显示和获取日期。例如,假设您在温哥华,如果您正在编辑 7 月或 12 月的日期,这可能意味着您正在编辑 PST 或 PDT 中的日期。

      我建议您查看下面的代码片段以测试此解决方案。

      毫秒级转换

      Number.prototype.toLocalDate = function () {
          var value = new Date(this);
      
          value.setHours(value.getHours() + (value.getTimezoneOffset() / 60));
      
          return value;
      };
      
      Number.prototype.toUTCDate = function () {
          var value = new Date(this);
      
          value.setHours(value.getHours() - (value.getTimezoneOffset() / 60));
      
          return value;
      };
      

      日期转化次数

      Date.prototype.getUTCTime = function () {
          return this.getTime() - (this.getTimezoneOffset() * 60000);
      };
      

      用法

      // Adds the timezone and daylight savings if applicable
      (1499670000000).toLocalDate();
      
      // Eliminates the timezone and daylight savings if applicable
      new Date(2017, 6, 10).getUTCTime();
      

      自己看看

      // Extending Number
      
      Number.prototype.toLocalDate = function () {
          var value = new Date(this);
      
          value.setHours(value.getHours() + (value.getTimezoneOffset() / 60));
      
          return value;
      };
      
      Number.prototype.toUTCDate = function () {
          var value = new Date(this);
      
          value.setHours(value.getHours() - (value.getTimezoneOffset() / 60));
      
          return value;
      };
      
      // Extending Date
      
      Date.prototype.getUTCTime = function () {
          return this.getTime() - (this.getTimezoneOffset() * 60000);
      };
      
      // Getting the demo to work
      document.getElementById('m-to-local-button').addEventListener('click', function () {
        var displayElement = document.getElementById('m-to-local-display'),
            value = document.getElementById('m-to-local').value,
            milliseconds = parseInt(value);
        
        if (typeof milliseconds === 'number')
          displayElement.innerText = (milliseconds).toLocalDate().toISOString();
        else
          displayElement.innerText = 'Set a value';
      }, false);
      
      document.getElementById('m-to-utc-button').addEventListener('click', function () {
        var displayElement = document.getElementById('m-to-utc-display'),
            value = document.getElementById('m-to-utc').value,
            milliseconds = parseInt(value);
        
        if (typeof milliseconds === 'number')
          displayElement.innerText = (milliseconds).toUTCDate().toISOString();
        else
          displayElement.innerText = 'Set a value';
      }, false);
      
      document.getElementById('date-to-utc-button').addEventListener('click', function () {
        var displayElement = document.getElementById('date-to-utc-display'),
            yearValue = document.getElementById('date-to-utc-year').value || '1970',
            monthValue = document.getElementById('date-to-utc-month').value || '0',
            dayValue = document.getElementById('date-to-utc-day').value || '1',
            hourValue = document.getElementById('date-to-utc-hour').value || '0',
            minuteValue = document.getElementById('date-to-utc-minute').value || '0',
            secondValue = document.getElementById('date-to-utc-second').value || '0',
            year = parseInt(yearValue),
            month = parseInt(monthValue),
            day = parseInt(dayValue),
            hour = parseInt(hourValue),
            minute = parseInt(minuteValue),
            second = parseInt(secondValue);
        
        displayElement.innerText = new Date(year, month, day, hour, minute, second).getUTCTime();
      }, false);
      <link href="https://cdnjs.cloudflare.com/ajax/libs/semantic-ui/2.2.11/semantic.css" rel="stylesheet"/>
      
      <div class="ui container">
        <p></p>
        
        <h3>Milliseconds to local date</h3>
        <input id="m-to-local" placeholder="Timestamp" value="0" /> <button id="m-to-local-button">Convert</button>
        <em id="m-to-local-display">Set a value</em>
      
        <h3>Milliseconds to UTC date</h3>
        <input id="m-to-utc" placeholder="Timestamp" value="0" /> <button id="m-to-utc-button">Convert</button>
        <em id="m-to-utc-display">Set a value</em>
        
        <h3>Date to milliseconds in UTC</h3>
        <input id="date-to-utc-year" placeholder="Year" style="width: 4em;" />
        <input id="date-to-utc-month" placeholder="Month" style="width: 4em;" />
        <input id="date-to-utc-day" placeholder="Day" style="width: 4em;" />
        <input id="date-to-utc-hour" placeholder="Hour" style="width: 4em;" />
        <input id="date-to-utc-minute" placeholder="Minute" style="width: 4em;" />
        <input id="date-to-utc-second" placeholder="Second" style="width: 4em;" />
        <button id="date-to-utc-button">Convert</button>
        <em id="date-to-utc-display">Set the values</em>
        
      </div>

      【讨论】:

      • 这是实际答案。对我来说就像一个魅力。设置 new Date(0) 并添加 milliSeconds 与 new Date(milliSeconds) 相同
      【解决方案11】:

      将以 [ms] 为单位的当前纪元时间转换为 24 小时制时间。您可能需要将选项指定为disable 12-hour 格式。

      $ node.exe -e "var date = new Date(Date.now()); console.log(date.toLocaleString('en-GB', { hour12:false } ));"
      
      2/7/2018, 19:35:24
      

      或作为 JS:

      var date = new Date(Date.now()); 
      console.log(date.toLocaleString('en-GB', { hour12:false } ));
      // 2/7/2018, 19:35:24
      
      console.log(date.toLocaleString('en-GB', { hour:'numeric', minute:'numeric', second:'numeric', hour12:false } ));
      // 19:35:24
      

      注意:此处使用en-GB 只是(随机)选择使用 24 小时格式的地点,它不是您的时区!

      【讨论】:

      • 这是从 Date 方法获得任何类型转换的最佳方式。谢谢!
      • 我唯一不喜欢上述内容的是,它以d/m/yyyy 的模棱两可格式返回日期,还是m/d/yyyy?正确的(最合乎逻辑的)显示方式应该是:yyyy-mm-dd。有接受者吗?
      【解决方案12】:

      @djechlin 对上述答案的补充

      d = '1394104654000';
      new Date(parseInt(d));
      

      将 EPOCH 时间转换为人类可读的日期。只是不要忘记那种类型的 EPOCH 时间必须是整数。

      【讨论】:

        【解决方案13】:

        纪元时间(即 Unix 纪元时间)几乎总是自 1970 年 1 月 1 日 00:00:00(UTC 时间)以来已过期的 秒数,而不是 毫秒数 这里的一些答案已经暗示了。

        https://en.wikipedia.org/wiki/Unix_time

        因此,如果给您一个 Unix Epoch 时间值,它可能以秒为单位,看起来像 1547035195。如果您想在 JavaScript 中使这个人类可读,您需要将值转换为毫秒,并将该值传递给 Date(value) 构造函数,例如:

        const unixEpochTimeMS = 1547035195 * 1000;
        const d = new Date(unixEpochTimeMS);
        // Careful, the string output here can vary by implementation...
        const strDate = d.toLocaleString();
        

        您不需要在接受的答案中执行 d.setUTCMilliseconds(0) 步骤,因为 JavaScript Date(value) 构造函数采用以毫秒为单位的 UTC 值(不是本地时间)。

        https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date#Syntax

        还请注意,您应避免使用采用字符串日期时间表示的Date(...) 构造函数,不建议这样做(请参阅上面的链接)。

        【讨论】:

          【解决方案14】:

          我找到的最简单的解决方案是:

          var timestamp = Date.now(), // returns milliseconds since epoch time
              normalisedTime = new Date(timestamp);
          

          请注意,new Date(timestamp) 语句末尾没有 * 1000,因为这(无论如何对我来说!)似乎总是给出错误的日期,即它没有给出 2019 年,而是给出了年份51015,所以请记住这一点。

          【讨论】:

            【解决方案15】:

            var myDate = new Date( your epoch date *1000);

            来源 - https://www.epochconverter.com/programming/#javascript

            【讨论】:

              【解决方案16】:

              最简单的方法

              如果你有以毫秒为单位的 unix 纪元,在我的情况下 - 1601209912824

              1. 将其转换为日期对象
              const dateObject = new Date(milliseconds)
              const humanDateFormat = dateObject.toString() 
              

              输出 -

              Sun Sep 27 2020 18:01:52 GMT+0530 (India Standard Time)
              
              1. 如果你想要 UTC 日期 -
              const dateObject = new Date(milliseconds)
              const humanDateFormat = dateObject.toUTCString() 
              
              1. 现在您可以随意格式化了。

              【讨论】:

                猜你喜欢
                • 2021-12-31
                • 1970-01-01
                • 1970-01-01
                • 2015-03-02
                • 1970-01-01
                • 1970-01-01
                • 2016-04-07
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多