Я пытаюсь решить эту проблему с часовым поясом. Мы хотели бы сохранить все DateTime
в формате UTC, а затем преобразовать DateTime
в часовой пояс пользователя.
Мы решили использовать для этого NodaTime, так как это кажется правильным подходом. Тем не менее, мы испытываем проблему с ним.
Вот как мы конвертируем DateTime
в UTC (обратите внимание — я пока жестко запрограммировал usersTimeZone
):
public static DateTime ConvertLocaltoUTC(this DateTime dateTime)
{
LocalDateTime localDateTime = LocalDateTime.FromDateTime(dateTime);
IDateTimeZoneProvider timeZoneProvider = DateTimeZoneProviders.Tzdb;
var usersTimezoneId = "Europe/Copenhagen";
var usersTimezone = timeZoneProvider[usersTimezoneId];
var zonedDbDateTime = usersTimezone.AtLeniently(localDateTime);
var returnThis = zonedDbDateTime.ToDateTimeUtc();
return zonedDbDateTime.ToDateTimeUtc();
}
И вот как мы конвертируем его обратно:
public static DateTime ConvertUTCtoLocal(this DateTime dateTime)
{
Instant instant = Instant.FromDateTimeUtc(dateTime);
IDateTimeZoneProvider timeZoneProvider = DateTimeZoneProviders.Tzdb;
var usersTimezoneId = "Europe/Copenhagen"; //just an example
var usersTimezone = timeZoneProvider[usersTimezoneId];
var usersZonedDateTime = instant.InZone(usersTimezone);
return usersZonedDateTime.ToDateTimeUnspecified();
}
Однако, когда мы конвертируем его обратно в местное время, возникает исключение:
Исключение аргумента: неверный DateTime.Kind для Instant.FromDateTimeUtc
в первой строке ConvertUTCtoLocal()
.
Примером DateTime
может быть: «18.09.2017 17:28:46» — да, это было с помощью метода ConvertLocalToUTC
.
Я предоставляю неправильный формат? Что я здесь делаю неправильно?