首页 文章

将UTC Epoch转换为本地日期

提问于
浏览
207

我现在一直在与此斗争 . 我正在尝试将纪元转换为日期对象 . 时代以UTC发送给我 . 每当你传递 new Date() 一个纪元时,它就会假定它是本地纪元 . 我尝试创建一个UTC对象,然后使用 setTime() 将其调整到正确的纪元,但唯一有用的方法是 toUTCString() ,字符串对我没有帮助 . 如果我将该字符串传递给新的日期,它应该注意到它是UTC,但事实并非如此 .

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

我的下一次尝试是尝试获取当地当前时期和UTC当前时期之间的差异,但我也无法得到它 .

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

它只给了我很小的差异,低于1000,这是毫秒 .

有什么建议?

13 回答

  • 2

    而对于日志,我使用Moment.js库来完成这个,我正在使用它进行格式化 .

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

    我想我有一个更简单的解决方案 - 将初始日期设置为纪元并添加UTC单位 . 假设您有一个UTC纪元var存储在几秒钟内 . 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)

  • 378

    首先将其转换为String,然后替换时区文本 .

    function convertUnixTime(time) {
      return new Date(time*1000).toString().replace("GMT+0530 (Sri Lanka Standard Time)","");
    }
    
  • 143
    function ToLocalDate (inDate) {
        var date = new Date();
        date.setTime(inDate.valueOf() - 60000 * inDate.getTimezoneOffset());
        return date;
    }
    
  • 15

    如果您希望在没有像moment.js这样的库的情况下解决UTC和当地时间的时间戳和日期转换,请查看下面的选项 .

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

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

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

    Conversions from milliseconds

    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;
    };
    

    Conversions from dates

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

    Usage

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

    See it for yourself

    // 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>
    
  • 0

    您是否只是要求将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);
    
  • 28

    @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();
    }
    
  • -1

    除了@djechlin的上述答案

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

    将EPOCH时间转换为人类可读日期 . 只是不要忘记EPOCH时间必须是整数 .

  • 0

    这很容易, new Date() 只需要几毫秒,例如

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

    纪元时间是1970年1月1日以秒为单位. date.getTime() 从1970年1月1日起返回毫秒,所以..如果你有一个纪元时间戳,请将它转换为javascript时间戳乘以1000 .

    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;
       }
    
  • 3

    要将[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
    

    Note: 这里使用 en-GB 只是一个(随机)选择使用24小时格式的地方,它不是你的时区!

  • 1

    考虑到,你有 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
    
  • 1

    EDIT

    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());
    

    EDIT 已修复

相关问题