簡體   English   中英

DateTime.Now沒有小數秒

[英]DateTime.Now without fractional seconds

我如何實際將DateTime.Now轉換為xsd:datetime格式2004-04-12T13:20:00-05:00並最終將其分配給架構XSD中的xsd:datetime類型的DateTime屬性(不是string )?

屬性:

public System.DateTime Timestamp {
        get {
            return this.timestampField;
        }
        set {
            this.timestampField = value;
        }

XSD:

<!-- Timestamp Type - Timezone portion is required and fractional seconds are prohibited -->
    <xsd:simpleType name="TimestampType">
        <xsd:annotation>
            <xsd:documentation>Base type for a date and time stamp</xsd:documentation>
        </xsd:annotation>
        <xsd:restriction base="xsd:dateTime">
            <xsd:pattern value="[1-9][0-9]{3}\-.+T[^\.]+(Z|[\+\-].+)"/>
        </xsd:restriction>
    </xsd:simpleType>

試過以下:

Timestamp = Datetime.Now;
Timestamp = DateTime.ParseExact(DateTime.Now.ToString("O"), "O", CultureInfo.InvariantCulture);

我按照xsd架構驗證在xml中跟隨無效

<Timestamp>2014-07-18T17:27:04.3185791-04:00</Timestamp>

我試圖找出如何為Timestamp屬性分配適當的值,該屬性根據xsd模式有效。 即。,2004-04-12T13:20:00-05:00沒有小數秒。

如果您查看此MSDN文章,您會發現它( 強調我的 ):

在內部, DateTime值表示為自0001年1月1日午夜12:00:00起經過的刻度數(100納秒間隔的數量) 實際的DateTime值與在用戶界面元素中顯示或寫入文件時該值的顯示方式無關。 DateTime值的出現是格式化操作的結果。 格式化是將值轉換為字符串表示的過程。

由於日期和時間值的出現取決於諸如文化,國際標准,應用程序要求和個人偏好等因素,因此DateTime結構通過其ToString方法的重載在格式化日期和時間值方面提供了極大的靈活性。 默認的DateTime.ToString()方法使用當前區域性的短日期和長時間模式返回日期和時間值的字符串表示形式。 以下示例使用默認的DateTime.ToString()方法,使用en-US文化的短日期和長時間模式顯示日期和時間,en-US文化是運行該示例的計算機上的當前文化。

因此,基於此,您可能希望嘗試從DateTime.Now創建的TimeStamp的特定字段中創建新的DateTime對象。現在,這將使表示小於一秒的時間間隔的刻度為零。 如果這不起作用,您可能使用了錯誤的Type,請改用字符串。

Timestamp = Datetime.Now;
Timestamp = new DateTime(Timestamp.Year,Timestamp.Month,Timestamp.Day,Timestamp.Hour,Timestamp.Minute,Timestamp.Second,Timestamp.Kind);

實際寫入XML的字段或屬性的類型可能應該是String或可能是自定義類型,而不是DateTime ,它在XmlSerializer內置了一些特殊處理。 但是,您當然可以擁有一個DateTime屬性來抽象獲取和設置基礎字段。

這是一個例子:

using System;
using System.Xml.Serialization;

namespace Sandbox2
{
    class MainClass
    {
        public static void Main (string[] args)
        {
            var now = DateTime.Now;
            var m = new Moment () { Timestamp = now };
            var xs = new XmlSerializer (typeof(Moment));
            xs.Serialize (Console.Out, m);
        }
    }

    public class Moment
    {
        [XmlElement("Timestamp")]
        public string BackingTimestamp;

        [XmlIgnore]
        public DateTime Timestamp
        {
            get
            {
                return DateTime.Parse (BackingTimestamp);
            }
            set
            {
                BackingTimestamp = value.ToString ("yyyy-MM-ddTHH:mm:ssK");
            }
        }
    }
}

輸出的相關部分:

<Timestamp>2014-07-19T12:20:24-05:00</Timestamp>

暫無
暫無

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

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