2013-08-14 2 views
0

Я работаю с телефоном Windows 8 и должен преобразовать объект DateTime в временную метку unix.Odd Unix Timestamp conversion

Я знаю, что есть много сообщений о том, как это сделать, но у меня есть странная ошибка, которую я просто не могу понять.

Я делаю это:

double val = (value.Ticks - New DateTime(1970,1,1).Ticks)/TimeSpan.TicksPerSecond; 

где значение является DateTime объекта я хочу, чтобы преобразовать в метку времени Unix. Я знаю, что это значение содержит правильное время, (во время отладки я вижу, что он имеет правильную дату + время)

но преобразованное значение unix всегда равно 2 часам. Должна быть проблема с часовыми поясами.

Может кто-нибудь мне помочь? Я нахожу работу с часовыми поясами очень раздражающими в WP, потому что нет методов для преобразования в определенный часовой пояс, отличный от UTC или Local.

+0

Я добавил тэг C#, так как я предполагаю, что это тот язык, который вы используете. Если нет, замените тег на один для используемого вами языка. –

+0

Возможный дубликат [Unix time conversion in C#] (http://stackoverflow.com/questions/7983441/unix-time-conversions-in-c-sharp) –

+1

Не делайте этого так. [Ответ Джона Скита] (http://stackoverflow.com/a/7983514/634824) на этот вопрос есть все, что вам нужно. Но вам нужно понять, что не все 'DateTime' созданы равными. Вопросы '.Kind' - это, вероятно, объясняет несоответствие, о котором вы говорили. –

ответ

2

Согласно this documentation, конструктор 3-аргумент для DateTime:

DateTime(Int32, Int32, Int32) 

"Инициализирует новый экземпляр структуры DateTime на указанный год, месяц и день." У него нет способа указать часовой пояс, и в документации не указан часовой пояс результата. Я предполагаю, что это местное время.

Там еще один конструктор:

DateTime(Int32, Int32, Int32, Int32, Int32, Int32, DateTimeKind) 

, что «Инициализирует новый экземпляр структуры DateTime на указанный год, месяц, день, час, минута, секунда, и всемирное координированное время (UTC) или местного времени ».

Попробуйте заменить

New DateTime(1970,1,1).Ticks 

по

New DateTime(1970,1,1,0,0,0,DateTimeKind.Utc).Ticks 

получить DateTime, представляющий 1970-01-01 00:00:00 UTC (если я правильно вспомнить синтаксис).

+0

спасибо, но я уже пробовал это. Независимо от того, что я делаю, время всегда ошибочно. Теперь я установил библиотеку Noda-Time, там я могу по крайней мере получить правильный часовой пояс, но я не понял, как получить текущее время в этом часовом поясе. – user2078645

+0

Если вы попробовали, и это не сработало, почему вы приняли этот ответ? –

+0

Я узнал, что это действительно сработало. Я думал, что временная метка unix зависит от местного времени, но я узнал, что временная метка unix должна быть одинаковой в каждом месте и что это не проблема, которая не отражает мой местный часовой пояс – user2078645