2016-09-04 3 views
0

Я пытаюсь преобразовать заданное значение DateTime в NodaTime с преобразованием часового пояса для отображения. Даже с тремя разными попытками я не могу заставить NodaTime дать мне ожидаемые результаты. Вот некоторые примеры кода (с учетом DateTime дт):Как преобразовать DateTime в NodaTime с часовым поясом?

//option 1 
NodaTime.DateTimeZone zone = NodaTime.DateTimeZoneProviders.Tzdb ["Africa/Johannesburg"]; 
NodaTime.LocalDateTime localDateTime = NodaTime.LocalDateTime.FromDateTime(dt); 
NodaTime.ZonedDateTime zonedDateTime = localDateTime.InZoneStrictly(zone); 
string str = zonedDateTime.ToString("H:mm:ss", System.Globalization.CultureInfo.InvariantCulture); 

Debug.LogFormat ("TimeZone: {0}", zone); 
Debug.LogFormat ("Option 1: {0} local: {1} zoned: {2}", str, localDateTime, zonedDateTime); 

//option 2 
NodaTime.Instant instant = NodaTime.Instant.FromDateTimeUtc (dt.ToUniversalTime()); 
zonedDateTime = instant.InZone(zone); 
str = zonedDateTime.ToString("H:mm:ss", System.Globalization.CultureInfo.InvariantCulture); 

Debug.LogFormat ("Option 2: {0} instant: {1} zoned: {2}", str, instant, zonedDateTime); 

//option 3 
DateTime epochStart = new DateTime (1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); 
long epochSeconds = (long)(dt.ToUniversalTime()- epochStart).TotalSeconds; 
instant = NodaTime.Instant.FromSecondsSinceUnixEpoch (epochSeconds); 
zonedDateTime = instant.InZone(zone); 
str = zonedDateTime.ToString("H:mm:ss", System.Globalization.CultureInfo.InvariantCulture); 

Debug.LogFormat ("Option 3: {0} epoch: {1} instant: {2} zoned: {3}", str, epochSeconds, instant, zonedDateTime); 

Запуск этого в какой-то стране другой, чем Южная Африка (например, в Израиле, где я сижу) дает правильное время для варианта 2 и 3. Когда я запускаю его в самой Южной Африке, он не работает, время отключается на один час. Вот пример вывода (правильные значения «17:55», например, варианты 2 и 3 для «Мой компьютер»). Конечно, преступник может быть часовой пояс или Daylight Savings различия, а не фактическое географическое положение:

----- Мой КОМПЬЮТЕР (притворяется SA) ------

TimeZone: Африка/Йоханнесбург

Вариант 1: 18:55:41 местные: 09/01/2016 18:55:41 зональные: 2016-09-01T18: 55: 41 Африка/Йоханнесбург (+02)

Вариант 2: 17 : 55: 41 мин: 2016-09-01T15: 55: 41Z зонированный: 2016-09-01T17: 55: 41 Африка/Йоханнесбург (+02)

Вариант 3: 17:55:41 эпоха: 1472745341 мгновенный: 2016-09-01T15: 55: 41Z зональные: 2016-09-01T17: 55: 41 Африка/Йоханнесбург (+02)

- --- Их КОМПЬЮТЕР (в SA) ------ TimeZone: Африка/Йоханнесбург

Вариант 1: 18:55:41 местный: 9/1/2016 6:55:41 zoned: 2016- 09-01T18: 55: 41 Африка/Йоханнесбург (+02)

Вариант 2: 18:55:41 мин: 2016-09-01T16: 55: 41Z зонированный: 2016-09-01T18: 55: 41 Африка/Йоханнесбург (+02)

Вариант 3: 18:55:41 эпоха: 1472748941 мгновенный: 2016-09-01T16: 55: 41Z зональные: 2016-09-01T18: 55: 41 Африка/Йоханнесбург (+02)

Как я могу убедиться, что выходные данные DateTime -> NodaTime согласованы, независимо от текущего местоположения?

+0

Непонятно, что вы * ожидали * здесь. Каким образом время на один час? Если ваш «DateTime» на самом деле является местным временем в указанном часовом поясе, тогда первый вариант выглядит отлично для меня, но, не зная, что yuo ожидает быть другим, трудно помочь. (Это помогло бы, если бы вы показали [mcve] с ожидаемым и фактическим выходом ...) –

+0

Перечитав это (пока не совсем ясно, IMO - особенно, поскольку он использует некоторый класс «DateUtils», который мы надеваем, я знаю) Я подозреваю, что проблема заключается в том, что компьютер работает. Если они перепутались со своими настройками часового пояса или не имеют актуальной информации о часовом поясе, тогда вы не можете многое сделать по этому поводу. Вариант 1 * только * использует преобразования часовых поясов Noda Time, поэтому будет согласованно, если вы используете одну и ту же версию данных часового пояса. –

+0

спасибо ... Я избавился от DateUtils. Текущее время в SA должно быть 1 час по местному времени здесь (в Израиле) – davidkomer

ответ

3

я сосредоточусь свой ответ на эту часть вопроса:

Как я могу убедиться, что моя DateTime -> NodaTime выходы последовательны, независимо от текущего местоположения?

Несколько мест в вашем коде, вы вызываете .ToUniversalTime() на объект DateTime. Когда вы это делаете, операция зависит от значения DateTimeKind, назначенного объекту Kind объекта. Пер the MSDN docs:

MSDN Table

Таким образом, до тех пор, как Kind не DateTimeKind.Utc, то входное значение интерпретируется как в локальной временной зоне, и, таким образом переход к UTC зависит от какой бы то ни этого местного времени зона находится на компьютере, где он запущен, что приводит к несогласованному выводу.

Если вы не хотите, чтобы ваш код выдавал разные результаты, когда местный часовой пояс отличается между двумя компьютерами, вы не должны использовать этот метод. Вот почему опция № 2 и опция №3 в вашем коде дают разные результаты.

Что касается варианта № 1, неясно, что вы на самом деле пытаетесь сделать. Вы утверждаете, что вход dt находится в часовом поясе Africa/Johannesburg, но вы никогда не просите какого-либо преобразования. Вы просто излучаете то же самое местное значение, в котором вы проходили. Если вы хотели конвертировать из UTC в Южную Африку или наоборот, тогда вам нужно объяснить это более четко в вопросе. Как бы то ни было, я не могу сказать, чего вы на самом деле хотите.

+0

Спасибо, это очень полезно! – davidkomer

Смежные вопросы