在c#中的特定时区中创建日期时间
我试图创建一个单元测试来测试机器上时区更改的情况,因为它已被错误地设置并更正。
在测试中,我需要能够在非本地时区创建DateTime对象,以确保运行测试的人员可以成功完成任务,而不管它们位于何处。
从我可以从DateTime构造函数中看到,我可以将TimeZone设置为本地时区,UTC时区或未指定。
如何创建一个像PST一样的特定时区的DateTime?
Jon的回答是关于TimeZone的,但我建议使用TimeZoneInfo。
就我个人而言,我喜欢在可能的情况下用UTC来保存东西,所以我会建议这样的结构:
public struct DateTimeWithZone
{
private readonly DateTime utcDateTime;
private readonly TimeZoneInfo timeZone;
public DateTimeWithZone(DateTime dateTime, TimeZoneInfo timeZone)
{
var dateTimeUnspec = DateTime.SpecifyKind(dateTime, DateTimeKind.Unspecified);
utcDateTime = TimeZoneInfo.ConvertTimeToUtc(dateTimeUnspec, timeZone);
this.timeZone = timeZone;
}
public DateTime UniversalTime { get { return utcDateTime; } }
public TimeZoneInfo TimeZone { get { return timeZone; } }
public DateTime LocalTime
{
get
{
return TimeZoneInfo.ConvertTime(utcDateTime, timeZone);
}
}
}
您可能希望将“TimeZone”名称更改为“TimeZoneInfo”以使事情更清晰 - 我更喜欢简要的自己。
DateTimeOffset结构是为这种类型的使用而创建的。
请参阅:http://msdn.microsoft.com/zh-CN/library/system.datetimeoffset.aspx
以下是使用特定时区创建DateTimeOffset对象的示例:
DateTimeOffset do1 = new DateTimeOffset(2008, 8, 22, 1, 0, 0, new TimeSpan(-5, 0, 0));
这里的其他答案很有用,但并不包括如何专门访问太平洋地区 - 在这里你去:
public static DateTime GmtToPacific(DateTime dateTime)
{
return TimeZoneInfo.ConvertTimeFromUtc(dateTime,
TimeZoneInfo.FindSystemTimeZoneById("Pacific Standard Time"));
}
奇怪的是,尽管“太平洋标准时间”通常意味着与“太平洋日报时间”有所不同,但在这种情况下,泛指太平洋时间。 事实上,如果您使用FindSystemTimeZoneById
来获取它,其中一个可用属性是一个bool,告诉您该时区当前是否处于夏时制。
你可以在一个库中看到更多的通用示例,我最终根据用户的要求在不同时区处理需要处理的日期时间,等等:
https://github.com/b9chris/TimeZoneInfoLib.Net
由于时间列表来自Windows注册表,因此这不适用于Windows以外的操作系统(例如Linux上的Mono): HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindows NTCurrentVersionTime Zones
在下面你会找到键(注册表编辑器中的文件夹图标); 这些密钥的名称是您传递给FindSystemTimeZoneById
。 在Linux上,您必须使用单独的Linux标准时区定义集,这些我尚未充分探索。