DateTime.Now没有小数秒

时间:2014-07-19 00:53:56

标签: c# xml datetime xsd

如何将DateTime.Now实际转换为xsd:datetime格式2004-04-12T13:20:00-05:00,最后将其分配给DateTime string属性xsd:datetime在模式XSD中键入?

属性:

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);

我在xml中跟随xsd模式验证无效

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

我试图找出如何为Timestamp属性分配适当的值,该属性根据xsd模式有效。即,2004-04-12T13:20:00-05:00,没有小数秒。

2 个答案:

答案 0 :(得分:4)

如果您查看此MSDN article,就会发现它(强调我的):

  

在内部, DateTime 值表示为,作为自0001年1月1日午夜12:00:00起经过的刻度数(100纳秒间隔的数量)。实际的DateTime值与在用户界面元素中显示或写入文件时该值的显示方式无关。 DateTime值的出现是格式化操作的结果。格式化是将值转换为字符串表示形式的过程。

     

由于日期和时间值的出现取决于诸如文化,国际标准,应用程序要求和个人偏好等因素,因此DateTime结构通过其ToString的重载在格式化日期和时间值方面提供了极大的灵活性。方法。默认的DateTime.ToString()方法使用当前区域性的短日期和长时间模式返回日期和时间值的字符串表示形式。以下示例使用默认的DateTime.ToString()方法,使用en-US文化的短日期和长时间模式显示日期和时间,en-US文化是运行该示例的计算机上的当前文化。

因此,基于此,您可能想尝试从DateTime创建的TimeStamp的特定字段中创建一个新的DateTime.Now对象,这会将表示时间间隔小于的时间间隔归零。一秒。如果这不起作用,您可能使用了错误的Type,请改用字符串。

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

答案 1 :(得分:2)

您实际写入XML的字段或属性的类型应该是String,或者可能是自定义类型,而不是DateTime,它在{{1}中内置了一些特殊处理}}。但是,您当然可以使用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");
            }
        }
    }
}