Po moim pierwszym poście:Konwersje NodaTime (część 2). Jak?
DateTime conversions using NodaTime on ASP.Net MVC 3 Razor website. How to?
jestem stara się znaleźć łatwy sposób przekonwertować datę/czas pomiędzy lokalnym a UTC (obie strony), stosując NodaTime.
Obecny obraz:
- mam datę/czas zapisany jako UTC w bazie danych.
- Podczas wyświetlania tego użytkownikowi powinienem wziąć pod uwagę lokalną strefę czasową i odpowiednio ją przekonwertować.
- Gdy użytkownik podaje datę/godzinę jako filtr, muszę przekonwertować go z powrotem na UTC przed wysłaniem do zapytania SQL.
Co mam tak daleko:
rozszerzenie do konwersji z UTC do lokalnych (ta część działa poprawnie):
public static DateTime UTCtoLocal(this DateTime dateTime)
{
IDateTimeZoneProvider timeZoneProvider = DateTimeZoneProviders.Tzdb;
var utcTimeZone = timeZoneProvider["UTC"];
var dateTimeFromDb = new DateTime(dateTime.Year, dateTime.Month, dateTime.Day, dateTime.Hour, dateTime.Minute, dateTime.Second, dateTime.Millisecond);
var zonedDbDateTime = utcTimeZone.AtLeniently(LocalDateTime.FromDateTime(dateTimeFromDb));
var usersTimezoneId = "Europe/London"; //just an example
var usersTimezone = timeZoneProvider[usersTimezoneId];
var usersZonedDateTime = zonedDbDateTime.WithZone(usersTimezone);
return usersZonedDateTime.ToDateTimeUnspecified();
}
Extension przekonwertować z lokalnym powrotem do UTC (ta część to problem):
public static DateTime LocaltoUTC(this DateTime dateTime)
{
IDateTimeZoneProvider timeZoneProvider = DateTimeZoneProviders.Tzdb;
var usersTimezoneId = "Europe/London";
var usersTimezone = timeZoneProvider[usersTimezoneId];
var dateTimeFromDb = new DateTime(dateTime.Year, dateTime.Month, dateTime.Day, dateTime.Hour, dateTime.Minute, dateTime.Second, dateTime.Millisecond);
var zonedDbDateTime = usersTimezone.AtLeniently(LocalDateTime.FromDateTime(dateTimeFromDb));
var utcTimezoneId = "UTC";
var utcTimezone = timeZoneProvider[utcTimezoneId];
var utcZonedDateTime = zonedDbDateTime.WithZone(utcTimezone);
return utcZonedDateTime.ToDateTimeUtc();
}
Co ja tu robię źle?
Jeszcze raz dziękuję, @ Jon. Wypróbuję to. Bądź na bieżąco z dobrą pracą nad NodaTime. – melancia
jaki jest pożytek LocaltoUTC, czy funkcja DateTime.ToUniversalTime() nie powinna działać? dzięki – pajics
@pajics: Nie, ponieważ to zawsze będzie używać strefy czasowej systemu - OP chce korzystać ze strefy czasowej użytkownika. –