DateTime parsing error: The supplied DateTime represents an invalid time

纵然是瞬间 提交于 2019-12-23 07:40:08

问题


I have one situation where date is "3/13/2016 2:41:00 AM". When I convert date by time-zone, I get an error.

DateTime dt = DateTime.Parse("3/13/2016 2:41:00 AM");
DateTime Date_Time = TimeZoneInfo.ConvertTimeBySystemTimeZoneId(dt, "Eastern Standard Time", 
                                                                    "GMT Standard Time");
Response.Write(dt);

after execution, I get this error:

The supplied DateTime represents an invalid time. For example, when the clock is adjusted forward, any time in the period that is skipped is invalid. Parameter name: dateTime


回答1:


Try to check if the time is ambiguous or a valid time. Due to the daylight change the time you mentioned i.e, 2:41:00 AM doesn not exist since the clock was moved 1 hour ahead and hence the date is invalid or ambiguous.

2016    Sun, 13 Mar, 02:00  CST → CDT   +1 hour (DST start) UTC-5h
        Sun, 6 Nov, 02:00   CDT → CST   -1 hour (DST end)   UTC-6h

You can also refer to this blog: System.TimeZoneInfo: Working with Ambiguous and Invalid Points in Time

System.TimeZoneInfo (currently available as part of .NET Framework 3.5 Beta 1) contains methods for checking if a DateTime instance represents an ambiguous or invalid time in a specific time zone. These methods are particularly useful for validating user-supplied points in time.

Background Information

Time zones that adjust their time for Daylight Saving Time (in most cases by moving the clock time back or forward by 1 hour) have gaps and repeats in the timeline — wherever the clock time was moved forward or back by the adjustment. Let’s use Pacific Standard Time as an example. In 2007 Pacific Standard Time (PST) changes to Pacific Daylight Time (PDT) at 02:00AM (“spring forward”) on the second Sunday in March and then returns at 02:00AM (“fall back”) on the first Sunday in November

To check if the time is valid you can use:

TimeZoneInfo.IsInvalidTime



回答2:


In my case, I was trying to convert a UTC date (thus, it was valid, as UTC dates don't skip any periods of time with DST).

The problem was that I was loading the date from Entity Framework and the DateKind was set to Unspecified. In that case, ConvertTimeBySystemTimeZoneId assumes it is a local time and may find it invalid.

The solution is to properly set the DateKind to UTC before converting:

var date = DateTime.ParseExact("2019-03-31T03:06:55.7856471", "O", CultureInfo.InvariantCulture);
// Here date.Kind == DateTimeKind.Unspecified

date = DateTime.SpecifyKind(date, DateTimeKind.Utc);
// Now date.Kind == DateTimeKind.Utc

// Now the conversion should work
TimeZoneInfo.ConvertTimeBySystemTimeZoneId(date, "Central Standard Time");


来源:https://stackoverflow.com/questions/36422138/datetime-parsing-error-the-supplied-datetime-represents-an-invalid-time

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!