Перетворити епоху UTC в місцеву дату


273

Я вже трохи боюся з цим. Я намагаюся перетворити епоху в об’єкт дати. Епоха надсилається мені в UTC. Кожен раз, коли ви проходите new Date()епоху, це передбачає, що це локальна епоха. Я спробував створити об’єкт UTC, потім скориставшись setTime()його відповідною епохою, але єдиний метод, який здається корисним, - це те, що toUTCString()рядки мені не допомагають. Якщо я передам цей рядок у нову дату, він повинен помітити, що це UTC, але це не так.

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

Наступною моєю спробою було спробувати визначити різницю між локальною епохою та поточною епохою UTC, але я також не зміг цього отримати.

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

Це дає мені лише невеликі відмінності, менші за 1000, що в мілісекундах.

Будь-які пропозиції?


11
Час епохи визначається як минулі мілісекунди з дати 1970 року в UTC . Не існує такої речі, як місцева епоха! Не впевнений, що я розумію вашу проблему.
Chetan Sastry

Можливо, часовий пояс на комп’ютері невірний, що призводить до іншого значення UTC?
kijin

2
Ви повинні встановити годинник на час UTC, якщо ви хочете "бачити" час UTC, коли ви використовуєте toLocaleString (). Опівночі UTC - 19:00 EST. Якщо ви використовуєте новий Date (). ToString () замість localeString, ви отримаєте щось на зразок: "Пт. 07 січня 2011 07:00:00 GMT-0500", що включає зміщення.
kennebec

Відповіді:


464

Я думаю, у мене є більш просте рішення - встановити початкову дату в епоху і додати одиниці 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)


189
FWIW, Об'єкти дати можна ініціалізувати з мілісекундами. Отже, var d = new Date(utcSeconds * 1000)має дати такий же результат.
куртховік

54
var d = new Date(1234567890000)повертає той же результат
Matjaz Lipus

11
думав, що, можливо, інші можуть отримати деяку чіткість через пару пунктів: об’єкт дати не встановлюється з часовим поясом, «зафіксованим у ньому». думайте про це як ні про що, як про число. це число - це кількість мілісекунд з 1970 січня на 1 UTC, до цього часу (зараз також у UTC). Отже, кожного разу, коли ви створюєте об’єкт дати, він дійсно знаходиться в UTC за кадром. 2. Щоб відобразити цю дату, ви можете відобразити її як параметр локалі (toLocaleString (), або в UTC (toUTCString ()). Вам не потрібно нічого перетворювати самостійно. Конструюйте з utc millisec, все добре. рядок - до тих пір, поки він знаходиться в локальному часовому поясі.
да Біч

2
1234567890000 трактується так само, як 1234567890, також проблема Y39K ...
muttonUp

1
@muttonUp, з 1000 мультипликацій він працював. Але, "проблема Y39K" Google не дає дійсного результату. Будь-яка URL буде корисною
P

238

Це легко, new Date()просто займає мілісекунди, наприклад

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

6
Хороший! Це дійсно слід розглядати як прийняту відповідь.
Нізар Б.

Цей не працював для мене, він працює, коли у вас є часова марка, але з utc epoch вам потрібно встановити utcseconds вручну, відповідь прийняття - правильна відповідь
sameerali

12
Це відповідна відповідь. Нова дата може зайняти мілісекунди, тому просто помножте на 1000 : const d = new Date(epoch * 1000).
vinyll

@sameerali Можливо, у вас виникли якісь інші проблеми з вашою системою або ви заплуталися. Ця відповідь є правильною відповіддю. Визначення епохи Unix: кількість секунд минуло з 1 січня опівночі UTC . Просто помножте на 1000, щоб отримати кількість минулих мілісекунд.
nalply

32

І лише для журналів я зробив це, використовуючи бібліотеку Moment.js , яку я все одно використовував для форматування.

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

1
Момент приємний, але божевільно використовувати бібліотеку 1,3 Мб, щоб просто перетворити одну епоху на побачення. Недарма там так багато додатків, що роздулися.
not2qubit

20

Час епохи - це секунди з 1 січня 1970 р. date.getTime()Повертає мілісекунди з 1 січня 1970 р., Тому .. якщо у вас є часова мітка епохи, перетворіть її в часову позначку 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;
   }

Цікаво було, що на землі Дуже добре знати, що epochTime! == javascriptTime, коли справа доходить до розбору дат. Дякую!
GrayedFox

16
 function ToLocalDate (inDate) {
    var date = new Date();
    date.setTime(inDate.valueOf() - 60000 * inDate.getTimezoneOffset());
    return date;
}

1
Ти зробив мій день. TY. Я просто замінив знак мінус знаком плюс на своїй роботі.
Людович Куті

5

Для перетворення поточного часу в [мс] в 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-годинного формату, це не ваш часовий пояс!


1
Це найкращий спосіб отримати будь-який тип конверсії за допомогою методу Date. Дякую!
SeaWarrior404

Єдине, що мені не подобається у вищезазначеному, це те, що він повертає дату у такому неоднозначному форматі d/m/yyyyчи це m/d/yyyy? Право (найбільш логічним) спосіб відображення це повинно бути: yyyy-mm-dd. Хто-небудь, хто приймає?
not2qubit

4

Час епохи (тобто час Unix Epoch) - це майже завжди число секунд, що минуло з 1 січня 1970 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)крок у прийнятій відповіді, оскільки Date(value)конструктор JavaScript приймає значення UTC в мілісекундах (не місцевий час).

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

Також зауважте, що вам слід уникати використання Date(...)конструктора, який приймає рядкове подання часу, це не рекомендується (див. Посилання вище).


3

Ви просто просите перетворити рядок 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

Доповнення до вищезгаданої відповіді від @djechlin

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

перетворює час EPOCH в читану людиною дату. Просто не забувайте, що тип часу EPOCH повинен бути цілим числом.


3

Найпростіше рішення, яке я знайшов для цього, це:

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

Зверніть увагу, що цього немає * 1000в кінці new Date(timestamp)твердження, оскільки це (для мене все одно!) Завжди видає неправильну дату, тобто замість того, щоб дати 2019 рік, він дає рік як 51015, тому просто врахуйте це.


2

Якщо ви хочете вирішувати часові позначки та перетворення дат з та до UTC та місцевого часу без бібліотек, таких як moment.js, перегляньте варіант нижче.

Для додатків, які використовують часові позначки UTC, можливо, вам потрібно буде вказати дату у веб-переглядачі, враховуючи місцевий часовий пояс та економію літнього часу, коли це можливо. Редагування дати, яка перебуває в інший часовий час, навіть якщо в одному часовому поясі може бути складним.

Наведені нижче Numberта Dateрозширення дозволяють показувати та отримувати дати у часовому поясі часових позначок. Наприклад, скажімо, що ви перебуваєте у Ванкувері, якщо ви редагуєте дату в липні або в грудні, це може означати, що ви редагуєте дату в 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();

Побачте самі


Це фактична відповідь. Працювало як шарм для мене. Встановлення нової дати (0) та додавання milliSeconds є такою ж, як нова дата (milliSeconds)
Jersey_Guy

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 виправлено


Я пережив це на своєму другому прикладі.
Різниці

Жоден з них мені не допомагає. У них відсутній метод setUTCTime, який був би ідеальним: P w3schools.com/jsref/jsref_obj_date.asp
Shane Reustle

Не працює, принаймні на Firefox для Ubuntu. Код не повинен встановлювати день / місяць / рік після встановлення дати.
Симон Козлов

@Simon Kozlov Насправді це неправильне припущення в об’єкті дати, setDate та getDate посилаються на день у місяці, і проблема полягає в тому, що я використовував такі функції, як (setUTCDay), яких не існує, здивований, що це прийнято !!
Амджад Масад

@AmjadMasad Ваша відповідь буде кориснішою, якщо ви також покажете очікуваний результат.
not2qubit

0

Враховуючи, у вас є 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


0

@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

Спочатку перетворіть його в String, а потім замініть текст часового поясу.

function convertUnixTime(time) {
  return new Date(time*1000).toString().replace("GMT+0530 (Sri Lanka Standard Time)","");
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.