2013-08-17 70 views
4

我試圖將轉換時間轉換爲用戶的時區,但我沒有諸如「太平洋標準時間」之類的Windows時區字符串。我所有的是一個字符串偏移,如「-07:00」。看起來我需要創建一個時間跨度。手動解析此字符串的唯一方法是?似乎應該有一種方法來使用字符串偏移量來轉換時間,但也許我錯過了一些東西。如何將字符串偏移量轉換爲c中的時間跨度#

我有這個,但它需要時區。我試圖修改它以使用偏移量,但您可以看到爲轉換創建的時間跨度,並且需要獲得我的時間偏移量。

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); 
} 

回答

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); 
+0

謝謝!太簡單了。我沒想到要尋找一種解析方法。 – KingOfHypocrites

+0

'TimeSpan.Parse'對於問題的這一部分是正確的,但要小心'.ToLocalTime()',因爲它會在它運行的計算機的時區 - 這可能是服務器一些其他時區。最後一個代碼塊是正確的,但他說他沒有時區ID輸入。 –

+1

如果你偏移字符串包含'+'字符,這不起作用。這必須先刪除。 – PaulG

-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))); 
} 
+0

你已經通過使用DateTime.Now來讓本地時區蠕變到轉換中,並且再次通過向DateTimeOffset構造函數中傳遞未指定類型的DateTime。 –

+0

@MattJohnson - 這只是一個例子,對大多數人來說暗示已經足夠了。 –

+0

也許是一個例子,說明*如何不做*大多數人只是複製粘貼而不去思考。 –

0

我試圖將轉換時間轉換爲用戶的時區,但我沒有Windows時區字符串,如「太平洋標準時間」。我所有的是一個字符串偏移,如「-07:00」。

那麼你沒有什麼你需要做出正確的轉換。閱讀timezone tag wiki中的「時區!=偏移」。

重要的是要了解"Pacific Standard Time"值是用於美國太平洋時間的TimeZoneInfo對象的.Id。它涵蓋了兩個太平洋標準時間(UTC-8)和太平洋夏令時(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

相關問題