在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标准时区定义集,这些我尚未充分探索。

链接地址: http://www.djcxy.com/p/46557.html

上一篇: Creating a DateTime in a specific Time Zone in c#

下一篇: Storing DateTime (UTC) vs. storing DateTimeOffset