2013-10-25 20 views
2

我正在序列化一個DateTime值,它工作正常,創建一個ISODateTime值。但它始終使用UTC進行序列化。強制本地日期時間序列化

YYY-MM-DDThh:mm:ss+hh:mm:ss 

當我創建了DateTime情況下,我強迫LocalTime

DateTime localDateTime = new DateTime(DateTime.Now.Ticks,DateTimeKind.Local); 

但是,由於某種原因,它始終序列化爲UTC(我一直得到 '+01:00' 末)。它應該自動讀取得到DataTimeKind和序列正常,但沒有... :(

如何配置串行或迫使DateTime屬性在當地時間要進行序列化

編輯?這是一個測試類

[Serializable] 
public class DateTimeTest 
{ 
    [System.Xml.Serialization.XmlElement("DateTime")] 
    public DateTime dateTime; 
} 

這是序列化代碼

public static string XMLSerializeToString<ObjectType>(ObjectType objetToSerialize, string defaultNamespace) 
    { 
     TextWriter stringWriter = new StringWriter(); 
     XmlSerializer serializer = 
      defaultNamespace==null ? new XmlSerializer(typeof(ObjectType)) : new XmlSerializer(typeof(ObjectType),defaultNamespace); 
     serializer.Serialize(xmlWriter, objetToSerialize); 
     return stringWriter.ToString(); 
    } 

這是呼喚串行

DateTime localDateTime = new DateTime(DateTime.Now.Ticks, DateTimeKind.Local); 
    DateTimeTest dateTimeTest = new DateTimeTest(); 
    dateTimeTest.dateTime = localDateTime; 
    string ser = XMLProcessor.XMLSerializeToString<DateTimeTest>(dateTimeTest, null); 

這是得到的字符串

<?xml version="1.0" encoding="utf-16"?> 
<DateTimeTest xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <DateTime>2013-10-25T17:01:35.7228+01:00</DateTime> 
</DateTimeTest> 

我不想讓17:01:35 + 01:00。我想得到17:01:35。我怎麼才能得到它?

謝謝:)

+3

You haven' t說你正在使用什麼序列化程序,但是如果你不想看到時區偏移量,你可以嘗試設置Kind to DateTimeKind.Unspecified。 – Joe

+1

你是什麼意思序列化?調用'ToString'方法? – Grundy

+1

'+01:00'表示該值不是UTC,否則就是'Z'。這是您當地時間相對於UTC的偏移量。所以我不明白你的問題。你也不會描述你如何序列化它。 – CodesInChaos

回答

2

正如我在評論說:

你還沒說你正在使用的串行器,但你可能它的種類,如果你不嘗試設置到DateTimeKind.Unspecified不想看到時區偏移量。

你的代碼來設置日期時間:

DateTime localDateTime = new DateTime(DateTime.Now.Ticks, DateTimeKind.Local); 

是不必要的笨拙,是完全等同於:

DateTime localDateTime = DateTime.Now; 

如果你想抵消的日期時間,將序列化無,它需要有DateTimeKind.Unspecified:

DateTime localDateTime = DateTime.Now.SpecifyKind(DateTimeKind.Unspecified); 
+0

它不完全相同,因爲'Now'可以返回兩種本地DateTime,而OP的代碼只返回其中的一個。即使使用DST開關,也需要第二種本地日期時間以確保往返於UTC。 – CodesInChaos

+0

@CodesInChaos - 我認爲它完全相同 - 你是什麼意思的「兩種本地DateTime」?從.NET 2.0開始,當Kind屬性被引入時,DateTime.Now總是返回Kind = Local(當然DateTime.UtcNow返回Kind = Utc)。 – Joe

+0

'DateTime'只公開一種'Local',但內部存儲兩個。該內部存儲的一個用於在DST開關期間消除時間歧義,其中例如, 「2:30本地」存在兩次。這意味着您可以通過Kind == Local獲得兩個'DateTime'值,它們看起來完全相同,但在轉換爲UTC時產生不同的時間。 – CodesInChaos

相關問題