asp.net - NodaTime conversions (Part 2). How to? -
following first post:
datetime conversions using nodatime on asp.net mvc 3 razor website. how to?
i'm struggling find easy way convert date/time between local , utc (both ways), using nodatime.
the current picture is:
- i have date/time saved utc in database.
- when displaying user, should consider local time zone , convert accordingly.
- when user provides date/time filter, need convert utc before sending sql query.
what have far:
extension convert utc local (this part working fine):
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 example var userstimezone = timezoneprovider[userstimezoneid]; var userszoneddatetime = zoneddbdatetime.withzone(userstimezone); return userszoneddatetime.todatetimeunspecified(); }
extension convert local utc (this part 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(); }
what doing wrong here?
your utctolocal looks it's doing more work needs to, honest.
it should be:
// note: datetime here must have "kind" of utc. public static datetime utctolocal(this datetime datetime) { instant instant = instant.fromdatetimeutc(datetime); idatetimezoneprovider timezoneprovider = datetimezoneproviders.tzdb; var userstimezoneid = "europe/london"; //just example var userstimezone = timezoneprovider[userstimezoneid]; var userszoneddatetime = instant.inzone(userstimezone); return userszoneddatetime.todatetimeunspecified(); }
similarly localtoutc should along these lines:
// datetime here should have "kind" of unspecified public static datetime localtoutc(this datetime datetime) { localdatetime localdatetime = localdatetime.fromdatetime(datetime); idatetimezoneprovider timezoneprovider = datetimezoneproviders.tzdb; var userstimezoneid = "europe/london"; var userstimezone = timezoneprovider[userstimezoneid]; var zoneddbdatetime = userstimezone.atleniently(localdatetime); return zoneddbdatetime.todatetimeutc(); }
you don't need convert different time zone: zoneddatetime
knows instant is, , todatetimeutc
right thing. note there's no real datetimefromdb
here, because if you're converting unspecified datetime
, that's presumably user...
Comments
Post a Comment