2015-10-06 59 views
1

我有日期和時間字符串已經在UTC。我需要使用這些字符串來創建一個DateTime對象。如何創建給定UTC時間和日期的DateTime對象?

這是我正在使用的代碼。問題是時間得到轉換,我的UTC時間在日期時間對象不再正確。我給UTC的值,所以他們不應該再次轉換。

string format = $"{dateFormat}_{timeFormat}"; 
string value = $"{dateValue}_{timeValue}"; 

var x = DateTimeOffset.ParseExact(value, format, CultureInfo.CurrentCulture).UtcDateTime; 

其中dateFormat = "ddMMyy"timeFormat = "HHmmss"dateValue = "191194"timeValue = "225446".

+0

這裏的問題是,你的DateTimeOffset對象將被默認抵消任何系統時區偏移。所以,如果運行你的代碼的機器是UTC-4,那麼.UtcDateTime將是你的值+ 4小時。 –

回答

5

d士丹利的答案肯定的作品,但稍微複雜一些比你需要的 - 如果你一個DateTime作爲結果,你不需要使用DateTimeOffset所有的,因爲DateTime.ParseExact處理DateTimeStyles.AssumeUniversal爲好,雖然你需要指定AdjustToUniversal,以便結果使用UTC。 (否則它會自動調整到本地時區 - 和幫倒忙,海事組織,但這是另一天戰鬥)

var x = DateTime.ParseExact(
    value, 
    format, 
    CultureInfo.CurrentCulture, 
    DateTimeStyles.AssumeUniversal | DateTimeStyles.AdjustToUniversal); 

示例代碼(這對我透露了DateTimeStyles.AdjustToUniversal的需要):

using System; 
using System.Globalization; 

class Test 
{ 
    static void Main(string[] args) 
    { 
     string text = "2015-06-10 20:52:13";   
     string format = "yyyy-MM-dd HH:mm:ss"; 
     var dateTime = DateTime.ParseExact(
      text, 
      format, 
      CultureInfo.InvariantCulture, 
      DateTimeStyles.AssumeUniversal | DateTimeStyles.AdjustToUniversal); 
     Console.WriteLine(dateTime); // 10/06/2015 20:52:13 on my box 
     Console.WriteLine(dateTime.Kind); // Utc 
    } 
} 

我使用CultureInfo.CurrentCulture,順便要小心 - 裸記住一個事實,即它會影響使用格式字符串的日曆系統以及等

(作爲一個側面說明,當然,我d建議使用我的Noda Time庫插件TEAD。在這種情況下,我可能會建議使用LocalTimeFormat解析您的時間,使用LocalDateFormat解析您的日期,然後將結果加在一起得到一個LocalDateTime,然後使用UTC轉換爲ZonedDateTime。或者你可以使用現有的方法來創建一個ZonedDateTimePatternInstantPattern,當然。)

+0

好醇'Jon Skeet,野田時代。 –

+0

@BrianDriscoll:那當然:) –

4

使用的DateTimeOffset.ParseExact,需要一個DateTimeStyles值過載:

var x = DateTimeOffset.ParseExact(value, 
            format, 
            CultureInfo.CurrentCulture, 
            DateTimeStyles.AssumeUniversal) 
         .UtcDateTime; 

注意,調用UtcDateTime傷害什麼,但時間將已經 b e在UTC時間(這是你想要的),所以它會讓你回到等效的DateTime值。正如Jon所說,你可以使用DateTime.ParseExact,它有相同的過載。

+0

如果你只是在你的代碼中使用'.DateTime',你最終會得到一種未指定...所以你確實需要UtcDateTime或其他一些技巧。 –

相關問題