如何格式化DateTime结构,使其与DataContractJsonSerializer使用的格式相匹配

本文关键字:格式 DataContractJsonSerializer 格式化 DateTime 结构 | 更新日期: 2023-09-27 17:58:53

当我使用DataContractJsonSerializer将当前时间序列化为DateTime时,我得到以下1307654074638-0500

我想生成我自己的JSON,它可以被DataContractJsonSerializer反序列化,但我不知道如何生成具有相同格式的DateTime

我相信它使用了自纪元以来的毫秒数作为基数,但我一直得到大约6小时的数字。我相信这与时区有关(我在中央时间),这是有道理的。

var myDate = DateTime.Now;
var epoch = new DateTime(1970, 01, 01, 01, 0, 0);
var serializer = new DataContractJsonSerializer(typeof (DateTime));
var ms = new MemoryStream();
serializer.WriteObject(ms, myDate);
Console.WriteLine(Encoding.UTF8.GetString(ms.ToArray()));
Console.WriteLine((myDate.AddTicks(-epoch.Ticks)).Ticks / 10000);

输出

"'/Date(1307654587318-0500)'/"
1307632987318

或者为了更容易比较

1307654587318-0500
1307632987318

如何格式化DateTime结构,使其与DataContractJsonSerializer使用的格式相匹配

我建议您使用DataContractJsonSerializer类来获得所需格式的数据。如果做不到这一点,你可以沿着以下路线做一些事情:

using System;
using System.Globalization;
using System.IO;
using System.Runtime.Serialization.Json;
using System.Text;
namespace SO6299496
{
    class Program
    {
        static void Main()
        {
            var myDate = DateTime.Now;                
            var serializer = new DataContractJsonSerializer(typeof(DateTime));
            var ms = new MemoryStream();
            serializer.WriteObject(ms, myDate);
            Console.WriteLine(Encoding.UTF8.GetString(ms.ToArray()));
            Console.WriteLine(SerializeDate(myDate));
        }

        static string SerializeDate(DateTime value)
        {
            var epoch = new DateTime(1970, 01, 01, 01, 0, 0);
            long date = (value.ToUniversalTime().Ticks - epoch.Ticks) / 10000;
            string sign = "";
            string offset = "";
            if (value.Kind == DateTimeKind.Unspecified || value.Kind == DateTimeKind.Local)
            {
                    TimeSpan utcOffset = TimeZone.CurrentTimeZone.GetUtcOffset(value.ToLocalTime());
                    sign = utcOffset.Ticks >= 0L ? "+" : "-";
                    int offsetHours = Math.Abs(utcOffset.Hours);
                    int offsetMinutes = Math.Abs(utcOffset.Minutes);
                    offset = (offsetHours < 10) ? ("0" + offsetHours) : offsetHours.ToString(CultureInfo.InvariantCulture);
                    offset += (offsetMinutes < 10) ? ("0" + offsetMinutes) : offsetMinutes.ToString(CultureInfo.InvariantCulture);
            }
            return date + sign + offset;
        }
    }
}

但我想再次重申,您最好使用DataContractJsonSerializer。为什么要发明已经发明的东西?