我有一个UTC DateTime值从一个数据库记录来。我也有一个用户指定的时间段(的TimeZoneInfo的实例)。如何转换是UTC日期时间给用户的本地时区?此外,我怎么判断用户指定的时区目前观察DST?我使用.NET 3.5。

谢谢, 标记

有帮助吗?

解决方案

有一个在所述的DateTimeOffset 结构:

// user-specified time zone
TimeZoneInfo southPole =
    TimeZoneInfo.FindSystemTimeZoneById("Antarctica/South Pole Standard Time");

// an UTC DateTime
DateTime utcTime = new DateTime(2007, 07, 12, 06, 32, 00, DateTimeKind.Utc);

// DateTime with offset
DateTimeOffset dateAndOffset =
    new DateTimeOffset(utcTime, southPole.GetUtcOffset(utcTime));

Console.WriteLine(dateAndOffset);

有关DST参阅 TimeZoneInfo.IsDaylightSavingTime 方法

bool isDst = southpole.IsDaylightSavingTime(DateTime.UtcNow);

其他提示

要做到这一点,最好的方法是简单地使用 TimeZoneInfo.ConvertTimeFromUtc

// you said you had these already
DateTime utc = new DateTime(2014, 6, 4, 12, 34, 0);
TimeZoneInfo tzi = TimeZoneInfo.FindSystemTimeZoneById("Pacific Standard Time");

// it's a simple one-liner
DateTime pacific = TimeZoneInfo.ConvertTimeFromUtc(utc, tzi);

,唯一的缺点是传入DateTime值也可以不具有DateTimeKind.Local种类。它必须是Utc,或Unspecified

可以,如果你想要一个的DateTimeOffset转换成另一种的DateTimeOffset使用中的TimeZoneInfo专用功能:

DateTimeOffset newTime = TimeZoneInfo.ConvertTime(
    DateTimeOffset.UtcNow, 
    TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time")
);

在南极答案只适用于匹配UTC的时区。我十分同意这种DateTimeOffset功能试验和错误小时后创伤,我已经成功地生产出实用的转换扩展功能,与所有时区的作品。

static public class DateTimeFunctions
{
    static public DateTimeOffset ConvertUtcTimeToTimeZone(this DateTime dateTime, string toTimeZoneDesc)
    {
        if (dateTime.Kind != DateTimeKind.Utc) throw new Exception("dateTime needs to have Kind property set to Utc");
        var toUtcOffset = TimeZoneInfo.FindSystemTimeZoneById(toTimeZoneDesc).GetUtcOffset(dateTime);
        var convertedTime = DateTime.SpecifyKind(dateTime.Add(toUtcOffset), DateTimeKind.Unspecified);
        return new DateTimeOffset(convertedTime, toUtcOffset);
    }
}

示例:

var currentTimeInPacificTime = DateTime.UtcNow.ConvertUtcTimeToTimeZone("Pacific Standard Time");
       //  TO get Currrent Time in current Time Zone of your System

        var dt = DateTime.Now;

        Console.WriteLine(dt);

        // Display Time Zone of your System

        Console.WriteLine(TimeZoneInfo.Local);

        // Convert Current Date Time to UTC Date Time

        var utc = TimeZoneInfo.ConvertTimeToUtc(dt, TimeZoneInfo.Local);

        Console.WriteLine(utc);

        // Convert UTC Time to Current Time Zone

        DateTime pacific = TimeZoneInfo.ConvertTimeFromUtc(utc, TimeZoneInfo.Local);

        Console.WriteLine(pacific);

        Console.ReadLine();
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top