GMT / UTC (не местное) время в формате Unix - PullRequest
2 голосов
/ 31 января 2012

Я использую JavaScript и пытаюсь получить время GMT + 0 / UTC + 0 (иначе называемое временем Зулу) в формате Unix.

Мне удалось узнать свое местное время в формате Unix, например:

var datetime = new Date()
var unixtime = Math.floor(Number(datetime/1000));

но когда я пытаюсь сделать то же самое с временем UTC ...

var datetime = new Date()
var year = datetime.getUTCFullYear()
var month = datetime.getUTCMonth()
var day = datetime.getUTCDate()
var hours = datetime.getUTCHours()
var minutes = datetime.getUTCMinutes()
var seconds = datetime.getUTCSeconds()
var unixtime = (Date.UTC(year,month,day,hours,minutes,seconds,00)/1000);

не получается. Я просто получаю свое местное время в формате Unix.

Вы можете запустить его вживую здесь: http://jsfiddle.net/wC8XH/1/ (Также на наклейке: http://pastebin.com/uDD5zUah)

Это пример вывода:

2012-01-30 23:15:19 = 1327958119
2012-01-30 21:15:19 = 1327958119

Выполнение:

date -d "2012-01-30 21:15:19" +%s

в Linux дает мне 1327950919, а не 1327958119. Разница составляет 7200 секунд, то есть 2 часа, что является моим часовым поясом (+0200).

Таким образом, я могу получить время UTC + 0, если я просто хочу, чтобы оно было в удобочитаемом для человека формате, но когда я запрашиваю Date.UTC для преобразования этого в формат Unix, вместо этого он выбирает преобразовать мое местное время.

Я что-то упустил?

Ответы [ 2 ]

3 голосов
/ 31 января 2012

Да, у вас проблема с ног на голову.

Javascript равен всегда , сообщая вам количество секунд в формате «Unix» в формате UTC или GMT.Потому что Unix всегда работает внутри UTC или GMT.Нет смысла говорить о «времени Unix», если не указано время UTC.

Таким образом, два ваших фрагмента кода Javascript находят один и тот же правильный ответ (Каково текущее «время Unix»?) Впростой и очень сложный способ, поэтому они дают одинаковый результат.

... и команда date чувствительна к локали.В вашей локали у вас есть смещение на 2 часа, поэтому предполагается, что ваша строка даты имеет смещение на 2 часа.Вы можете запретить так вести себя, используя флаг -u, что означает, что вы обещаете, что ваши строки имеют время UTC.

Вот несколько примеров, устанавливая переменную окружения TZ для видимого часового поясапри условии, что строки изменены (значения TZ указаны для общего файла часового пояса Unix, имена, доступные в вашей конкретной системе, могут отличаться).

$ TZ="America/New_York" date -d "2012-01-30 21:15:19" +%s
1327976119
$ TZ="Europe/Paris" date -d "2012-01-30 21:15:19" +%s
1327954519
$ date -u -d "2012-01-30 21:15:19" +%s
1327958119
2 голосов
/ 31 января 2012

Прежде всего, как уже сказано @ tialaramex , оба фрагмента кода JavaScript верны, поэтому вы должны предпочесть более короткий.

Проблема в команде Linux date,Когда вы передаете дату, она интерпретирует ее в вашем текущем часовом поясе, а не в UTC!Посмотрите:

$ date -d "2012-01-30 21:15:19" +%s
1327954519
$ scala
scala> new java.util.Date(1327954519 * 1000L)
res0: java.util.Date = Mon Jan 30 21:15:19 CET 2012

Я живу в CET, обратите внимание, что вывод date отличается от вашего.

ОБНОВЛЕНИЕ: следуя великому предложению @ derobert ниже вВ комментариях вы можете явно указать часовой пояс при вызове date:

$ date -d "2012-01-30 21:15:19+0000" +%s
1327958119
$ scala
scala> new java.util.Date(1327958119 * 1000L)
res0: java.util.Date = Mon Jan 30 22:15:19 CET 2012

21: 15 в UTC - 22:15 CET, все в порядке.

...