如何让javascriptdatetimeconverter()生成无时区的Microsoft风格日期格式?
实现无时区的JavaScript日期序列化格式
完全可以实现这个需求,你可以通过两种方式来去掉日期序列化结果中的时区部分:
方法一:自定义日期转换器
创建一个继承自JavaScriptDateTimeConverter的自定义转换器,重写WriteJson方法,直接生成无时区的日期格式:
public class NoTimeZoneDateTimeConverter : JavaScriptDateTimeConverter { public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { if (value is DateTime date) { // 计算从1970-01-01 UTC到目标日期的毫秒数 long timestamp = (long)(date.ToUniversalTime() - new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)).TotalMilliseconds; writer.WriteRawValue($"\"/Date({timestamp})/\""); } else { base.WriteJson(writer, value, serializer); } } }
使用时将自定义转换器加入序列化配置即可:
var settings = new JsonSerializerSettings(); settings.Converters.Add(new NoTimeZoneDateTimeConverter()); var serializedJson = JsonConvert.SerializeObject(yourDateData, settings);
方法二:正则替换现有输出
如果不想自定义转换器,也可以在序列化完成后,用正则表达式移除时区后缀:
var originalJson = JsonConvert.SerializeObject(yourDateData, new JavaScriptDateTimeConverter()); var noTimeZoneJson = Regex.Replace(originalJson, @"\/Date\((\d+)[+-]\d+\)\/", @"/Date($1)/");
这种方式更轻量化,适合快速调整输出格式,但要确保JSON结构中没有其他类似格式的字符串,避免误匹配。
两种方法都能生成和Microsoft JavaScriptSerializer一致的无时区日期格式"/Date(1667894400000)/"。
内容的提问来源于stack exchange,提问作者Brobic Vripiat
相关产品推荐
相关产品推荐

