【问题标题】:DateTime formatting .Net C#日期时间格式化.Net C#
【发布时间】:2015-06-24 06:06:26
【问题描述】:

我收到了这种格式的日期和时间:

\/Date(1434013505757-0700)\/

我只是找不到将其重新格式化为人类可读格式的方法。

提前谢谢你,

【问题讨论】:

  • 试着描述一下这是什么格式。年、日、月在哪里...
  • 知道那个值意味着代表什么日期/时间吗?如果是这样,请与我们分享该信息。如果不是,您将如何评估任何答案是否真的正确?
  • 一般来说,程序员有责任知道他的程序输入的来源和格式。因此,有责任找出格式。数据必须来自某个组织的某个地方。您需要遍历组织树直到数据源。在我的经验中。问通常会有所帮助。至于我们,我们只能推测。
  • 这是古老的 DataContractSerializer 的格式,从早期的 AJAX 时代开始,Json 中还没有日期的概念,所以微软决定输出一个转义的 UNIX 时间戳,这样它就不会与文本或一个号码。真正的解决方案是替换 DataContractSerializer - 日期格式只是它的问题之一。 ASP.NET MVC、Web API、所有其他 REST 服务都使用 ISO 日期格式。否则,您必须将字符串解析为实际日期

标签: .net datetime


【解决方案1】:

您正在查看由DataContractJsonSerializer 生成的 Micooft 日期格式。

以下示例输出当前日期,然后输出示例中的日期时间:

var ser = new DataContractJsonSerializer(typeof(Example));
var ex = new Example{ MSDate = DateTime.Now};

// write Example to the stream
var ms = new MemoryStream();
ser.WriteObject(ms, ex);

var cnt = Encoding.UTF8.GetString(ms.ToArray());
Debug.WriteLine(cnt);  // show wireformat
            
ms.Position = 0;
var exdes = (Example)ser.ReadObject(ms); // read back

// create our own json stream and deserialize
var somejsonwithdate = @"{""MSDate"":""\/Date(1434013505757-0700)\/""}";

var yourdate = (Example) ser.ReadObject(
        new MemoryStream(Encoding.UTF8.GetBytes(somejsonwithdate)));

Debug.WriteLine("{0:yyyy-MM-dd h:mm:ss", yourdate.MSDate);

这里是 DTO 类型

public class Example
{
    public DateTime MSDate { get; set; }
}

此代码在我的调试输出中输出:

{"MSDate":"/Date(1435128933854+0200)/"}
2015-06-11 11:05:05

来自 MSDN 文章Stand-Alone JSON Serialization

DateTime 值显示为 JSON 字符串,格式为“/Date(700000+0500)/”,其中第一个数字(在提供的示例中为 700000)是 GMT 时区的毫秒数,常规(非夏令时)自 1970 年 1 月 1 日午夜以来的时间。该数字可能为负数以表示较早的时间。示例中由“+0500”组成的部分是可选的,表示时间是本地类型的——也就是说,应该在反序列化时转换为本地时区。如果不存在,则将时间反序列化为 Utc。实际数字(本例中为“0500”)及其符号(+ 或 -)被忽略。

ASP.NET AJAX 客户端 JavaScript 代码自动将此类字符串转换为 JavaScript DateTime 实例。如果在 .NET 中还有其他格式相似但不是 DateTime 类型的字符串,它们也会被转换。

只有在“/”字符被转义时才会发生转换(即 JSON 看起来像“/Date(700000+0500)/”),因此 WCF 的 JSON 编码器(由 WebHttpBinding 启用)总是转义“/”字符。

【讨论】:

    【解决方案2】:

    这是(最佳猜测)UNIX Timestamp,具有毫秒分辨率和时区偏移。

    请参阅here,了解如何在两者之间进行转换。请记住,该示例基于“Second”分辨率,但您的示例是“MilliSecond”分辨率。所以使用 AddMilliSeconds。

    1434013505757-0700
    |<--------->| |--|
     Unix          TimeZone 
     TimeStamp     Offset   
    

    希望您可以自己找出代码。请注意,时区偏移以小时为单位。仅供参考 Unix-Timestamp 定义为自 1970 年 1 月 1 日格林威治午夜以来经过的秒数(或毫秒)。

    【讨论】:

    • 这解释了数字,请参阅DateTime wire format Date( 和额外的斜线来自哪里。
    • 你是对的,但也要记住时区偏移是额外的数据,。时间戳是基于 UTC 的,无论提供什么偏移量。这与其他格式略有不同,例如 ISO8601,其中显示的时间已经通过该偏移量进行了调整。在这里,它没有。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-12
    • 2011-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多