簡體   English   中英

如何將字符串轉換為本地日期時間?

[英]How to convert string to local Date Time?

我試圖轉換這種格式的字符串:

MM/dd/yyyy HH:mm

輸入來自美國數據庫,即:09/20/2010 14:30

我知道我的字符串總是美國時間,但是當我顯示它時,我需要將其轉換為本地時間,以便字符串應該變成:

09/20/2010 19:30 (for UK for instance)

我嘗試了一些東西,但是當我在美國機器上運行時,似乎沒有什么能給我正確的解決方案。

CompletedDttm = DateTime.ParseExact(value, "MM/dd/yyyy HH:mm", CultureInfo.CurrentCulture);
CompletedDttm = DateTime.ParseExact(value, "MM/dd/yyyy HH:mm", new CultureInfo("en-US"));

它們都在本地工作(美國機器),但它們不會將時間轉換為歐洲機器上的當地時間。

謝謝托尼

更新:如果要將數據可靠地轉換為其他任何內容,您必須知道數據的時區 (不僅僅是“US”)以及解釋機器。 您不僅要查看小時偏移量,而且DST也會根據位置而變化(並非所有區域都遵守它)。 東部是-4或-5,取決於一年中的時間。 如果日期足夠老,你會遇到“夏天”日期最近發生變化的問題。

您最好的方法是始終以UTC格式存儲時間戳。 除此之外,你可以猜測偏移量。


如果您想要轉換到其他時區,您應該使用UTC時間(新的,略有不同的GMT版本)。

DateTime dt = new DateTime(DateTime.Parse('2010-10-06 19:40').Ticks, DateTimeKind.Local);
dt.AddHours(5);
dt.ToLocalTime();

您也可以使用TimeZoneInfo ,它也會有DST信息。

除非您另行指定,否則解析將假定您將字符串解析為當前時區。 美國文化只是意味着字符串的預期格式 ,與時區無關(例如,在美國它可能是EST,也可能是PST)。

您的字符串不包含時區信息,因此您自然會在當地時區獲得您的價值。 你可以:

  1. 添加時區信息
  2. 之后更改時區

試試這個 - 它將當地時間(以美國格式輸入)轉換為GMT,然后以GB / DE格式打印。

var zones = TimeZoneInfo.GetSystemTimeZones();    // retrieve timezone info
string value = "09/20/2010 14:30";

DateTime CompletedDttm = DateTime.ParseExact(value, "MM/dd/yyyy HH:mm",    
    new CultureInfo("en-US"));
DateTime FinalDttm = TimeZoneInfo.ConvertTime(CompletedDttm, 
    TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time"), 
    TimeZoneInfo.FindSystemTimeZoneById("GMT Standard Time"));
string output = FinalDttm.ToString(new CultureInfo("en-GB"));

FinalDttm = TimeZoneInfo.ConvertTime(CompletedDttm, TimeZoneInfo.Local, 
    TimeZoneInfo.FindSystemTimeZoneById("W. Europe Standard Time"));
output = FinalDttm.ToString(new CultureInfo("de-DE"));

輸出依次為:

20/09/2010 19:30:00

20.09.2010 20:30:00

我認為這是一個顯示問題,但需要更多信息才能確定。 嘗試在兩種情況下以yyyy-MM-dd格式顯示日期,以檢查問題是解析還是顯示。 如果您確切知道要接受或顯示的內容,則可以創建自定義格式信息對象:

    public static DateTimeFormatInfo GetISOFormatInfo()
    {
        DateTimeFormatInfo dtFormat = new DateTimeFormatInfo();
        dtFormat.DateSeparator = "-";
        dtFormat.TimeSeparator = ":";
        dtFormat.ShortDatePattern = "yyyy-MM-dd";
        dtFormat.ShortTimePattern = "HH:mm:ss";
        return dtFormat;
    }

使用沒有TimeZone信息的日期,您將無法知道英國時間/加拿大時間等...因為您不知道誰(世界的哪個部分)在那個時間插入。 由於您特別說時間是美國時間,您可以添加世界不同地區的時差來顯示當地時間。

你可以使用string.Split。 首先在整個字符串上使用'/'分隔符。 您將獲得“09”“20”和“2010 14:30”,然后再使用''和':'分割2次

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM