Epoch Time (тики с 1970 года) - Mac против Windows - PullRequest
5 голосов
/ 11 января 2010

У меня есть несколько веб-сервисов на C #, которые возвращают JSON. .NET JavaScriptSerializer возвращает даты в эпоху времени (миллисекунды с 1970 года). На любом компьютере под управлением Windows веб-приложение без проблем обрабатывает миллисекунды до нужной даты.

На моем Mac даты иногда отключаются на 1 час. Не каждый раз Только иногда. Это сейчас происходит и на iPhone, который я сейчас создаю.

Сначала я подумал, что потерял некоторую точность при делении миллисекунд на 1000, чтобы создать действительный объект NSDate Objective-C. Затем я протестировал создание даты в javascript на Mac Firefox с той же отметкой времени и получил такое же смещение на 1 час.

Есть идеи? Спасибо ...

Редактировать: Я также заметил в консоли в XCode, что дата создания имеет -4 или -5 рядом с ней. Я предполагаю, что это смещение по Гринвичу. Те, кажется, изменяются независимо от того, смещена ли дата на 1 час. Таким образом, некоторые -4 даты и некоторые -5 являются правильными, а некоторые из них смещены.

Редактировать: Примеры использования:

console.log(new Date(-1173643200000));

возвращается Вс 23 октября 1932 00:00:00 GMT-0400 (EST)

console.log(new Date(-1031515200000));

Возвращает Сб 24 апреля 1937 23:00:00 GMT-0500 (EST)

NSDate* date = [NSDate dateWithTimeIntervalSince1970:ticks / 1000];

-589320000000 =
1951-04-30 00:00:00 -0400

-1173643200000 =
1932-10-22 23:00:00 -0500 

(Это верное в консоли Firebug, неверное в консоли XCode)

-1303416000000 =
1928-09-12 00:00:00 -0400

-1492545600000 =
1922-09-15 00:00:00 -0400

-1263668400000 =
1929-12-16 00:00:00 -0500

-1252094400000 =
1930-04-29 00:00:00 -0400

-1046458800000 =
1936-11-03 00:00:00 -0500

-1298746800000 =
1928-11-05 00:00:00 -0500

-1031515200000 =
1937-04-24 23:00:00 -0500   

(возвращает неверно как в консоли Firebug, так и в консоли XCode)

-910465200000 =
1941-02-24 00:00:00 -0500

-1152648000000 =
1933-06-23 00:00:00 -0400

-1109793600000 =
1934-10-31 23:00:00 -0500

Возможно ли, что Microsoft / Mozilla / Apple имеют противоречивые правила, определяющие, когда тогда началось летнее время?

Редактировать: Mac Firefox и Windows Firefox получают разные результаты для -1031515200000. Обе машины настроены на один и тот же часовой пояс.

Ответы [ 3 ]

4 голосов
/ 11 января 2010

Звучит очень похоже на то, что один из них дает вам тики начиная с эпохи, а другой дает вам миллисекунды с 1 января 1970 года в вашем местном часовом поясе ... или они интерпретируют данные таким образом. Все ли "неправильные" даты летом, случайно? (РЕДАКТИРОВАТЬ: Теперь я видел ваши изменения, я вижу, что вы думаете в том же духе.)

Не могли бы вы дать нам примеры значений и код, который вы используете в разных местах? Вы уверены, что само значение неверно, и это не просто проблема с отображением?

Если это возможно, было бы неплохо предоставлять моменты с полуночи 1 января 1970 года UTC . Большинство платформ предоставляют достаточно простой способ справиться с этим. В .NET, если вы используете DateTimeOffset вместо DateTime, вам следует избегать хотя бы некоторых из этих проблем. (Конечно, в будущем правильным решением будет использование Noda Time . Но пока нет.)

РЕДАКТИРОВАТЬ: Хорошо, теперь вы предоставили пример данных, не похоже, что на самом деле есть какое-то несоответствие в мгновенном возвращенном ... это преобразование в местное время, которое отличается Вполне возможно, что разные платформы будут иметь разные взгляды на историческую информацию о часовом поясе, конечно - некоторые могут просто иметь постоянное правило, которое, как они предполагают, будет правильным, а будет правильным всегда, другие будут знать о изменения связаны. Я бы ожидал, что большинство платформ примет во внимание исторические изменения в эти дни, по общему признанию ...

По крайней мере, на iPhone я ожидаю, что вы сможете написать код для определения переходов часового пояса, а затем сравнить его с тем, что дает .NET через TimeZoneInfo.

Что ваше приложение на самом деле делает с этой информацией? Вы заинтересованы в этом как момент времени (который можно рассматривать в разных часовых поясах) или просто как местное время?

2 голосов
/ 12 января 2010

Я думаю, что платформа будет отличаться, когда заканчивается и начинается летнее время. Верны ли метки времени для текущих лет?

0 голосов
/ 11 января 2010

Бьюсь об заклад, это вещь часового пояса, где ваш Mac конвертирует временные метки в ваш местный часовой пояс, который для некоторых временных меток соответствует летнему времени (DST), а некоторые нет, что приводит к разнице во времени на один час по сравнению с UTC, что делает не имеют ДСТ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...