2012-06-03 17 views
2

我有一些JavaScript代碼,我試圖傳遞給我的Web服務。我的JavaScript代碼應該以UTC格式發送日期。在本地,我生成代碼的時間是在12:30:43 pm。當我執行我的JavaScript代碼,生成以下日期/時間:從JavaScript解析日期和時間到C#

2012-06-03T20:30:43.000Z

從這些代碼生成日期/時間:

var now = new Date(); 
var utcDate = new Date(
    now.getUTCFullYear(), 
    now.getUTCMonth(), 
    now.getUTCDate(), 
    now.getUTCHours(), 
    now.getUTCMinutes(), 
    now.getUTCSeconds() 
); 

當我從Javascript傳遞的日期/時間回到我的Web服務,它被序列如下所示:

在這一點上,這看起來是正確的。然後我需要將該字符串轉換爲C#中的日期/時間。試圖做到這一點,我使用以下C#代碼:

DateTime _value = DateTime.MinValue; 
DateTime.TryParseExact(value, "yyyyMMddHHmmss", CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal, out _value) 

當發生這種情況時,我得到以下日期/時間。 2012/6/3 12:30:43 PM

我在做什麼錯?我期待日期/時間爲2012年6月3日4:30:43 PM

回答

3

您收到的結果是正確的,但請檢查DateTimeKind屬性。您會注意到它未設置爲UTC,而是設置爲Local

您可以使用DateTimeStyles.AdjustToUniversal生成DateTime,其中Kind設置爲UTC

DateTime dateTime; 
DateTime.TryParseExact(
    value, 
    "yyyyMMddHHmmss", 
    CultureInfo.InvariantCulture, 
    DateTimeStyles.AssumeUniversal | DateTimeStyles.AdjustToUniversal, 
    out dateTime); 

看到它的工作ideone

+0

我會認爲使用['o'格式說明符](http://msdn.microsoft.com/en-us/library/az4se3k1.aspx#Roundtrip)就足夠了。 – Oded

0

您必須將日期參數作爲UTC格式傳遞給Web服務,然後使用TryParse方法將其轉換爲C#日期對象。

試試這個:

//Javascript 
var now = new Date(); //just like: 'Thu, 21 Mar 2013 12:44:40 GMT' 
var utcNowString = now.toUTCString(); //pass this parameter to your web service 

這是C#代碼:

DateTime date; 
DateTime.TryParse(jsDateString, out date); //parsed as: '21.03.2013 14:44:40' 

希望這有助於。

0

如果你只是想使用(例如webAPI)序列化,我發現JS toISOString非常有用和兼容。

//JAVASCRIPT 
var d = new Date(); 
$toPut.dateTime = d.toISOString(); 
$toPut.put() 

//C# 
[Put("/setup/dateTime"), HttpPut] 
public HttpResponseMessage SetDateTime([FromBody]DateTime dateTimeSettings) 

這樣你就可以保留你的數據結構而不用處理解析。