Я пытаюсь преобразовать заданное значение 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 согласованы, независимо от текущего местоположения?
Непонятно, что вы * ожидали * здесь. Каким образом время на один час? Если ваш «DateTime» на самом деле является местным временем в указанном часовом поясе, тогда первый вариант выглядит отлично для меня, но, не зная, что yuo ожидает быть другим, трудно помочь. (Это помогло бы, если бы вы показали [mcve] с ожидаемым и фактическим выходом ...) –
Перечитав это (пока не совсем ясно, IMO - особенно, поскольку он использует некоторый класс «DateUtils», который мы надеваем, я знаю) Я подозреваю, что проблема заключается в том, что компьютер работает. Если они перепутались со своими настройками часового пояса или не имеют актуальной информации о часовом поясе, тогда вы не можете многое сделать по этому поводу. Вариант 1 * только * использует преобразования часовых поясов Noda Time, поэтому будет согласованно, если вы используете одну и ту же версию данных часового пояса. –
спасибо ... Я избавился от DateUtils. Текущее время в SA должно быть 1 час по местному времени здесь (в Израиле) – davidkomer