.NET: Accounting for daylight savings
我有一个方法,它使用用户输入创建一个UTC DateTime,使用其地理位置的GMT偏移量:
1 2 3 4 5 6 7 8 9 10 11 12
| public static DateTime LocalToUtc
(int year, int month, int day, int hour, decimal gmtOffset ) {
// argument validation here
var dateTime = new DateTime (year, month, day ).AddHours(hour );
var dateTimeOffset =
new DateTimeOffset (dateTime, TimeSpan .FromHours(gmtOffset ));
return dateTimeOffset .UtcDateTime;
} |
问题是,如果该功能在用户时区内节约了日光,那么它将关闭一小时。
因此,虽然我的个人格林威治标准时间偏移量是-8,但由于日光节约,当前时区偏移量是-7。
如何将上述功能更改为夏令时节省?难道我不需要从gmt偏移量中创建一些时区对象并得到它的时区偏移量吗?
在不知道实际时区的情况下是无法做到这一点的:几个时区具有相同的基础UTC偏移量,但夏令时的规则不同。例如,西欧标准时间和中非标准时间的偏移量都是+01:00,但前者支持DST,后者不支持,所以偏移量不足以决定DST是否适用……
您的方法应该使用一个TimeZoneInfo参数,而不是gmtOffset参数。这样,您只需使用TimeZoneInfo.ConvertTime方法转换日期,它将自动考虑DST。
- 好吧,我知道,我说我给的日期是什么时间在他们的地区。如何创建的TimeZoneInfo对象?在其他的话,we change the parameter to TimeZoneInfo。好吧。然后我们need a to send to the TimeZoneInfo对象的函数。法how is that?
- 你可以使用TimeZoneInfo.FindSystemTimeZoneByIdthe method。现在你可以get the list of time with the区在TimeZoneInfo.GetSystemTimeZonesmethod,the user that和让卡车从列表。
- 你可以呼叫timezoneinfo.createcustomtimezone实例化或任何你想的时间区。
datetime已经有了这样的方法:ToLocalTime()和ToUniversalTime()。用那个有什么问题?
编辑:
基于作者希望从当前计算机时区以外的时区转换为UTC的评论,我建议您参阅此处的John Skeets答案
来自msdn文档:
1 2 3 4 5 6 7 8
| string displayName ="(GMT+06:00) Antarctica/Mawson Time";
string standardName ="Mawson Time";
TimeSpan offset = new TimeSpan (06, 00, 00 );
TimeZoneInfo mawson = TimeZoneInfo .CreateCustomTimeZone(standardName,
offset, displayName, standardName );
Console .WriteLine("The current time is {0} {1}",
TimeZoneInfo .ConvertTime(DateTime .Now,
TimeZoneInfo .Local, mawson ), mawson .StandardName); |
- 当diffing DateTime值是在不同的时区的小车。这是especially UTC annoying when the kind of local is not at all,集。
- gregc @ -不,它的不是车。你就永远不能确定,localtime has the correct datetime信息集。这就是为什么你convert to to do the比较UTC。
- @神秘è重新gregc is right,the Man,suited is not to handle的DateTime结构。不同的时间。这就是为什么我precisely DateTimeOffset结构引进茶……
- 男人:"神秘è重新尝试让datetime datetime对象在使用。现在,使用datetime.utcnow和另一个。差分带。错误(除非你要守在GB)。
- 我怎么能使用新的日期(年,月,日).addhours(时光)(格林尼治标准时间),当不.touniversaltime is included in the datetime信息胶印?知道如何将它使用到格林尼治标准时间?
- 错误:不gregc @ J ^ Al。7小时对我来说,白天加大单储蓄+ 1)。
- 我感知of that。但这不是车。马车是not as that着欧洲EN为设计工作。什么是确切的说因为是自制的DateTime does to do。如果你期望它做什么它不是设计为T,这不是车。这就像complaining智能车车,因为它是有问题的trailers hauling重金属。did not the question Asker说He was?比较多。虽然在一时间。if the run on the App是有计算机局域网,然后touniversaltime is perfectly(结束)。
- dotnetquestiondate there are several @ -构造函数overloads that allow to You datetime datetime或specify wither is the localtime UTC。localtime is to the running the local的计算机应用程序。如果你想在不同的时区的日期时间specify for a is that the running on the App计算机是不同的,那么小
- 好吧,那么让我给你一个错误。这是可能的DateTime值that to create a does not specify UTC或本地。尽量在线呼叫touniversaltime(that)值。我真的应该把它,因为不知道要做什么。但它不。
- 是的,不同的计算机应用程序的时区比the is running。
- "如果不把gregc恩已经在或者是UTC。如果那是什么它只是does the房屋。如果它是assumes unspecified,the local时间框架(this is the documented行为)。
- 男人:"神秘è重新entirely convinced am not。让我们离开它在那。让我们同意不同意。
- 谢谢你为你的编辑!
因为听起来你在要求用户提供一个时间偏移量,而这个时间偏移量可能不一定在机器的本地时区内,所以本地机器时间不起作用。但是,使用TimeZoneInfo类,您应该能够构造一个实例来说明偏移量和DST状态,并从中使用内置方法。
编辑:至少在我的机器上,TimeZoneInfo.GetSystemTimeZones()似乎返回了所有有效的时区。这可以很容易地映射到下拉菜单以允许用户选择。
- 基于calculated is the GMT偏移在地理数据集。他们要在他们当他们登录弹出LAT /左炔诺孕酮。你看起来是那么的LAT启动中LNG / dB的derives table which the GMT偏移。
- 他们是他们inputting to get the lat lng/专门开发的时区,or some other is used for as /好用吗?你可以使用if not,and the TimeZoneInfo.GetSystemTimeZones()只是给用户选择在落下。alternately:does this集胶印或DST信息只是给AS,好吗?if it has DST的信息,你可以创建自定义的instance of TimeZoneInfo on the飞。
如果不想使用内置的UTC方法,应该使用TimeZone.GetUtcOffset方法。
http://msdn.microsoft.com/en-us/library/system.timezone.getutcoffset.aspx
它将为您提供到UTC的偏移量。您还可以使用内置方法从本地时间获取UTC时间。
http://msdn.microsoft.com/en-us/library/system.datetime.touniversaltime(v=vs.100).aspx
- how to get a时区对象给呼叫getutcoffset在线?在用户知道is the S GMT偏移。