2009-12-09 98 views
31

我有javascript日期對象,它給了我這種格式的日期字符串,「Wed Dec 16 00:00:00 UTC-0400 2009」。Javascript date to C#via Ajax

我通過Ajax把它傳遞給服務器(ASP.NET C#)

我如何轉換, 「星期三12月16日00:00:00 UTC-0400 2009」 到C#DateTime對象。 DateTime.Parse失敗。

回答

52

您可以使用DateTime.ParseExact它允許你指定要用於解析格式字符串:

DateTime dt = DateTime.ParseExact("Wed Dec 16 00:00:00 UTC-0400 2009", 
            "ddd MMM d HH:mm:ss UTCzzzzz yyyy", 
            CultureInfo.InvariantCulture); 
+0

+1我不知道你能做到這一點,非常酷:) – Jay 2009-12-10 00:02:06

+0

您可能想使用DateTimeOffset代替。 – ColacX 2016-06-27 08:08:03

0

說實話我不會嘗試在C#中解析日期字符串,我個人會嘗試從您的javascript日期對象中創建更有用的日期結構。

例如,你可以在JavaScript將返回表示日期的對象,您可以使用DateTime.Parse()上轉換爲C#DateTime對象的MS使用parse()

30

最可靠的方法是使用毫秒,因爲時代。通過致電Date.getTime(),您可以輕鬆地在JavaScript中獲得此信息。然後,在C#中,你可以將其轉換爲這樣的日期時間:

long msSinceEpoch = 1260402952906; // Value from Date.getTime() in JavaScript 
return new DateTime(1970, 1, 1).AddTicks(msSinceEpoch * 10000); 

你有10000乘以從毫秒到「蜱」,這是100納秒轉換。

+1

我知道這是一個古老的答案,但我確實有一個問題。是否有什麼特別的原因可以添加新的TimeSpan,而不是調用DateTime的'.AddMilliseconds'方法? – Joshua 2011-11-15 17:25:08

+1

沒有理由我記得。我已經編輯了使用'AddTicks'的答案,這可能比'AddMilliseconds'稍微快一點(我們在這裏談論幾個CPU週期)。 – EMP 2011-12-12 09:33:11

+1

我很好奇爲什麼「時代」是1970/01/01。事實證明,這是「Unix時代」。我想我會分享,以防其他人感到好奇或困惑:http://en.wikipedia.org/wiki/Unix_time – 2012-06-20 16:26:06

5

僅僅爲了後人,爲了幫助未來的Google員工,我想擴展EMP的答案。

EMP的回答提供時間UTC(如果這就是你想要的,使用它)。

要到達客戶端本地時間在C#:

在JavaScript:

 var now = new Date(); 
     var UTC = now.getTime(); 
     var localOffset = (-1) * now.getTimezoneOffset() * 60000; 
     var currentTime = Math.round(new Date(UTC + localOffset).getTime()); 

在C#:

 DateTime currentTimeDotNet = new DateTime(1970, 1, 1).AddTicks(Convert.ToInt64(currentTime) * 10000); 

感謝this blog和EMP的答案,但採取了一些在兩端進行試驗和錯誤,以確保未來夥伴的合作。

+0

這是最正確的答案正確處理時區調整。 – 2014-01-15 13:04:35

22

你的情況,這可能是不可能的,但我真的建議更新JS代碼通過ISO 8601格式的日期/時間。 http://en.wikipedia.org/wiki/ISO_8601

ISO 8601不僅是正式的標準,它也易於使用,並防止很多時區麻煩!

要獲得8601個日期字符串在Javascript:

var d = new Date(); 
var iso_time = d.toISOString(); //"2014-05-06T18:49:16.029Z" 

要閱讀C#8601個日期字符串:

DateTime d = DateTime.Parse(json_string); 
+0

我認爲這是最好的方法,因爲它只是一個步驟,並不需要通過其他任何環節來處理時區或System.DateTime分析。 – zomf 2015-04-08 22:45:23

+0

我正在使用這種方法來符合時刻 – 2016-06-21 19:08:31

+0

這個答案適用於我的場景。 – blfuentes 2017-08-23 14:30:50