我已经为此挣扎了一段时间。我正在尝试将epoch转换为日期对象。纪元以UTC格式发送给我。无论何时向new Date()传递一个epoch,它都假定它是本地epoch。我尝试创建一个UTC对象,然后使用setTime()将其调整为适当的epoch,但唯一有用的方法是toUTCString()和字符串对我没有帮助。如果我将这个字符串传递给一个新的日期,它应该注意到它是UTC,但它没有。

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

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

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

它只给了我非常小的差别,在1000以下,单位是毫秒。

有什么建议吗?


当前回答

考虑到您有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

其他回答

如果您更喜欢解析时间戳和日期从UTC和本地时间到UTC和本地时间的转换,而不需要像moment.js这样的库,请查看下面的选项。

对于使用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>

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

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

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

纪元时间是从1970年1月1日开始的,单位为秒。date.getTime()返回1970年1月1日的毫秒数,因此..如果你有一个epoch时间戳,通过乘以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;
   }

将当前以[ms]为单位的epoch时间转换为24小时时间。您可能需要指定禁用12小时格式的选项。

$ 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小时格式的地方的(随机)选择,它不是您的时区!

我认为我有一个更简单的解决方案——将初始日期设置为epoch并添加UTC单位。假设您有一个以秒为单位存储的UTC epoch 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现在是一个日期(在我的时区)设置为2009年2月13日星期五18:31:30 GMT-0500 (EST)