如何用c#表示DateTime

本文关键字:DateTime 表示 何用 | 更新日期: 2023-09-27 18:08:30

protogen.exelong类型的proto2消息字段生成以下模式:

private long _Count = default(long);
[global::ProtoBuf.ProtoMember(1, IsRequired = false, Name=@"Count", DataFormat = global::ProtoBuf.DataFormat.TwosComplement)]
[global::System.ComponentModel.DefaultValue(default(long))]
public long Count
{
  get { return _Count; }
  set { _Count = value; }
}

但由于proto2不包括日期-时间类型(protobuf-net不支持proto3,其中包括google.protobuf.Timestamp),因此不清楚如何在手动编码的c#原型对象中表示DateTime

这可能是错误的:

private DateTime _When = DateTime.MinValue;
[global::ProtoBuf.ProtoMember(1, IsRequired = false, Name=@"When", DataFormat = global::ProtoBuf.DataFormat.Default)]
[global::System.ComponentModel.DefaultValue(DateTime.MinValue)]
public DateTime When
{
  get { return _When; }
  set { _When = value; }
}

什么是正确的方式来装饰DateTime属性与protobuf-net使用

如何用c#表示DateTime

这取决于您希望它在网络上看起来是什么样子。如果您希望它是long (delta到epoch),那么:这样做。例如:

[ProtoMember(...)] public long Foo {get;set;}

如果你想让它是long在线和DateTime在你的代码:这样做:

 public DateTime Foo {get;set;}
 [ProtoMember(...)] private long FooSerialized {
    get { return DateTimeToLong(Foo); }
    set { Foo = LongToDateTime(value); }
  }

如果你不关心,只是想存储一个DateTime,这样做:

[ProtoMember(...)] public DateTime Foo {get;set;}

现在支持Timestamp类型:

[global::ProtoBuf.ProtoMember(1, IsRequired = false, Name=@"When",
    DataFormat = global::ProtoBuf.DataFormat.WellKnown)]
public DateTime When {get;set;}