gpt4 book ai didi

c# - 如何为 JSON.NET 序列化添加时区偏移量?

转载 作者:可可西里 更新时间:2023-11-01 08:34:37 37 4
gpt4 key购买 nike

我的 DateTimePicker 绑定(bind)到属性:

    picker.DataBindings.Add("Value", this, "EventDate");
...
private DateTime eventDate;
public DateTime EventDate
{
get
{
var offset = TimeZoneInfo.Local.GetUtcOffset(eventDate);
string json = JsonConvert.SerializeObject(eventDate, Formatting.Indented);
Console.WriteLine("get: {0} --- {1}", json, offset);
return eventDate;
}
set
{
var offset = TimeZoneInfo.Local.GetUtcOffset(value);
string json = JsonConvert.SerializeObject(value, Formatting.Indented);
Console.WriteLine("set: {0} --- {1}", json, offset);
eventDate = value;
}
}

每当数据绑定(bind)设置属性时,我都会得到以下结果:

set: "2015-08-03T16:06:59" --- 04:00:00
get: "2015-08-03T16:06:59" --- 04:00:00

get/set 中的代码仅用于调试目的。整个类与 EventDate 属性一起序列化。

如何修改 DateTime 变量和/或 json 序列化程序以包含时区偏移,例如:

"2014-08-03T16:06:59.8708232+04:00"

奇怪的是,如果我创建全新的 DateTime 对象并在没有绑定(bind)的情况下分配给 DateTime.Now,JSON.NET 将向其附加时区偏移量。无法弄清楚有什么区别。

最佳答案

你试过输入DateTimeOffset吗?而不是 DateTime?这是带有时区信息的类型。

var example = new
{
Now = DateTimeOffset.Now,
UtcNow = DateTimeOffset.UtcNow,
Sometime = new DateTimeOffset(2014, 10, 11, 1, 4, 9, new TimeSpan(8, 0, 0)),
FromDateTime = new DateTimeOffset(new DateTime(2010, 1, 1)),
};
string json = JsonConvert.SerializeObject(example, Formatting.Indented);
Console.WriteLine(json);

给我:

{
"Now": "2014-08-03T22:08:47.8127753+08:00",
"UtcNow": "2014-08-03T14:08:47.8137754+00:00",
"Sometime": "2014-10-11T01:04:09+08:00",
"FromDateTime": "2010-01-01T00:00:00+08:00"
}

编辑 - 替代方式

您注意到 DateTime.Now 在 JSON 中有时区偏移,而手动创建的 DateTime 没有。这是因为 DateTime.NowKind 等于 DateTimeKind.Local 而另一个有 DateTimeKind.Unspecified,并且JSON.NET 只是以不同的方式处理它们。

所以另一种方法是:

var product2 = new
{
Now = DateTime.Now,
Sometime = new DateTime(2014, 10, 11, 0, 0, 0),
SometimeLocal = new DateTime(2014, 10, 11, 0, 0, 0, DateTimeKind.Local),
SometimeUtc = new DateTime(2014, 10, 11, 0, 0, 0, DateTimeKind.Utc)
};

string json2 = JsonConvert.SerializeObject(product2, Formatting.Indented);

Console.WriteLine(json2);

哪些输出:

{
"Now": "2014-08-03T23:39:45.3319275+08:00",
"Sometime": "2014-10-11T00:00:00",
"SometimeLocal": "2014-10-11T00:00:00+08:00",
"SometimeUtc": "2014-10-11T00:00:00Z"
}

EDIT2 - 用于数据绑定(bind)

好的,您使用数据绑定(bind)。然后你可以更新你的 setter 以自动转换:

picker.DataBindings.Add("Value", this, "EventDate");
...
private DateTimeOffset eventDate;
public DateTime EventDate
{
get { return eventDate.LocalDateTime; }
set { eventDate = new DateTimeOffset(value); }
}

然后你可以使用eventDate序列化为JSON。

或者设置Kind:

picker.DataBindings.Add("Value", this, "EventDate");
...
private DateTime eventDate;
public DateTime EventDate
{
get { return eventDate; }
set
{
// Create a copy of DateTime and set Kind to Local since Kind is readonly
eventDate = new DateTime(value.Ticks, DateTimeKind.Local);
}
}

两者都应该有效。

关于c# - 如何为 JSON.NET 序列化添加时区偏移量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25104537/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com