【问题标题】:Force local DateTime serialization强制本地 DateTime 序列化
【发布时间】:2013-10-25 11:13:36
【问题描述】:

我正在序列化一个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”)。它应该自动读取 get 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。我怎样才能得到它?

谢谢:)

【问题讨论】:

  • 您还没有说明您使用的是什么序列化程序,但如果您不想看到时区偏移量,可以尝试将其 Kind 设置为 DateTimeKind.Unspecified。
  • 序列化是什么意思?调用ToString方法?
  • +01:00 表示该值不是 UTC,否则它将是 Z。这是您的本地时间相对于 UTC 的偏移量。所以我不明白你的问题。你也没有描述你如何序列化它。
  • 顺便说一句。 DateTime.Now 已经返回了本地 DateTime 值,因此您构造日期的怪异方式对大多数日期没有任何影响,但是当由于 DST 切换而导致本地时间不明确时会导致错误。
  • 为了记录,您可以更改DateTime 类型,而无需使用Ticks。使用DateTime.Now 时,您绝对不需要将类型更改为本地(正如 CodesInChaos 提到的那样,它已经是本地的)。要更改 DateTime 的日期类型,请使用 DateTime.SpecifyKind 方法。

标签: c# datetime serialization


【解决方案1】:

正如我在评论中所说:

您尚未说明您使用的是什么序列化程序,但如果您不想看到时区偏移量,可以尝试将其 Kind 设置为 DateTimeKind.Unspecified。

您设置日期时间的代码:

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

不必要地笨拙,完全等同于:

DateTime localDateTime = DateTime.Now;

如果你想要一个没有偏移量的日期时间,它需要有 DateTimeKind.Unspecified:

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

【讨论】:

  • 它并不完全等价,因为Now 可以返回两种本地日期时间,而 OP 的代码只返回其中一种。即使使用 DST 开关,也需要第二种本地日期时间来确保到 UTC 的往返工作。
  • @CodesInChaos - 我认为它完全一样 - 你所说的“两种本地日期时间”是什么意思?从 .NET 2.0 开始,引入 Kind 属性时,DateTime.Now 总是返回 Kind = Local(当然 DateTime.UtcNow 返回 Kind = Utc)。
  • DateTime 只暴露了一种Local,但内部存储了两种。内部存储的一个用于在 DST 切换期间消除歧义,例如“2:30 local”存在两次。这意味着您可以获得两个带有Kind == LocalDateTime 值,它们看起来相同,但转换为UTC 时会产生不同的时间。
猜你喜欢
  • 2011-04-01
  • 1970-01-01
  • 2011-12-02
  • 2017-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-18
相关资源
最近更新 更多