如何在c#中将字符串偏移量转换为时间跨度

时间:2013-08-17 19:59:54

标签: c# timezone timespan

我正在尝试将转换时间转换为用户的时区,但我没有Windows时区字符串,例如“太平洋标准时间”。我只有一个字符串偏移量,如“-07:00”。看起来我需要创建一个时间跨度。是手动解析此字符串的唯一方法吗?似乎应该有一种方法来使用字符串偏移来转换时间,但也许我错过了一些东西。

我有这个,但它需要时区。我正在尝试修改它以使用偏移量,但您可以看到为转换创建的时间跨度,我需要将偏移量设置为时间跨度。

static void Main(string[] args)
{
    var currentTimeInPacificTime = ConvertUtcTimeToTimeZone(DateTime.UtcNow, "Pacific Standard Time");
    //TimeSpan ts = new TimeSpan("-07:00");
    Console.ReadKey();
}

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

4 个答案:

答案 0 :(得分:5)

您可以使用TimeSpan.Parse方法:

TimeSpan ts = TimeSpan.Parse("-07:00");
Console.WriteLine(ts);   // -07:00:00

或者如果您想要更安全一点,请尝试TimeSpan.TryParse方法:

TimeSpan ts;
if (TimeSpan.TryParse("-07:00", out ts))
    Console.WriteLine(ts);   // -07:00:00

但是,当然如果您只想将UTC日期/时间转换为本地日期/时间,您可以这样做:

DateTime localDateTime = utcDateTime.ToLocalTime();

或将其转换为任何时区:

TimeZoneInfo tzi = TimeZoneInfo.FindSystemTimeZoneById(toTimeZoneDesc);
DateTime localDateTime = TimeZoneInfo.ConvertTime(utcDateTime, tzi);

答案 1 :(得分:1)

对于更复杂/非标准格式,您还可以使用TimeSpan.ParseExact(String, String, IFormatProvider),其中第二个字符串是Custom TimeSpan Format String

API信息可在msdn.microsoft.com上获得,并链接在上面。链接。

答案 2 :(得分:1)

  

我正在尝试将转换时间转换为用户的时区,但我没有Windows时区字符串,例如“太平洋标准时间”。我所拥有的是一个字符串偏移量,例如“-07:00”。

然后你没有做出正确转换所需的东西。请阅读timezone tag wiki中的“时区!=偏移”。

请务必了解"Pacific Standard Time"值是用于美国太平洋时间的.Id对象的TimeZoneInfo。它涵盖 太平洋标准时间(UTC-8)和Pacfic日光时间(UTC-7)。

  

我所拥有的是一个字符串偏移量,例如“-07:00”。看起来我需要创建一个时间跨度。

现在你有了通常所说的the XY Problem。您不应该单独使用偏移量。

在您的代码中,有一个dateTime.Add(toUtcOffset)的来电。在进行时区转换时,这是code smell你做错了。您永远不必手动添加或减去时间只是为了操纵时区。这应该保留用于实际改变你所谈论的时刻。

您应该做的是从用户那里收集实时区域ID。 "Pacific Standard Time"用于TimeZoneInfo"America/Los_Angeles"用于Noda Time等TZDB实施。

如果时区转换在您的上下文中不重要,那么您可能只想收集完整的DateTimeOffset值,例如2013-08-17T13:27:00.000-07:00

答案 3 :(得分:-1)

时区字符串包含“太平洋标准时间”。完整列表可以在这里找到。 http://www.xiirus.net/articles/article-_net-convert-datetime-from-one-timezone-to-another-7e44y.aspx

任何DateTime对象都可以转换为某个时区 -

    TimeZoneInfo timeZoneInfo; 
    DateTime dateTime ; 

    //Set the time zone information to Pacific Standard Time
    timeZoneInfo = TimeZoneInfo.FindSystemTimeZoneById("Pacific Standard Time"); 
    //Get date and time in US Mountain Standard Time 
    dateTime = TimeZoneInfo.ConvertTime(DateTime.Now, timeZoneInfo);
    //Print out the date and time
    Console.WriteLine(dateTime.ToString("yyyy-MM-dd HH-mm-ss")); 

因此您可以将方法修改为 -

static DateTimeOffset ConvertUtcTimeToTimeZone(DateTime dateTime, string toTimeZoneDesc)
{
   return new DateTimeOffset(TimeZoneInfo.ConvertTime(dateTime, TimeZoneInfo.FindSystemTimeZoneById(toTimeZoneDesc)));
}