C# 在项目设置中保存DateTimeOffset设置时丢失精度
当我在项目设置中保存一个C# 在项目设置中保存DateTimeOffset设置时丢失精度,c#,serialization,application-settings,datetimeoffset,C#,Serialization,Application Settings,Datetimeoffset,当我在项目设置中保存一个datetimeofest时,我失去了一些精度: 第一个变量是序列化之前的原始值。 第二个是反序列化后的值 事实上,我的变量在配置文件中是这样序列化的: <?xml version="1.0" encoding="utf-8"?> <configuration> <userSettings> <MyApp.Properties.Settings> [...]
datetimeofest
时,我失去了一些精度:
第一个变量是序列化之前的原始值。
第二个是反序列化后的值
事实上,我的变量在配置文件中是这样序列化的:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<userSettings>
<MyApp.Properties.Settings>
[...]
<setting name="LatestCheckTimestamp" serializeAs="String">
<value>02/22/2013 14:39:06 +00:00</value>
</setting>
[...]
</MyApp.Properties.Settings>
</userSettings>
</configuration>
MyApp.Settings
是Visual studio在项目属性页中编辑设置时生成的类
编辑2:解决方案:
根据马特·约翰逊的回答,我是这样做的:
LatestCheckTimestamp
重命名为LatestCheckTimestampString
,但不在我的代码中设置
:<configuration>
<userSettings>
<MyApp.Properties.Settings>
[...]
<setting name="LatestCheckTimestampString" serializeAs="String">
<value>2013-02-22T16:54:04.3647473+00:00</value>
</setting>
</MyApp.Properties.Settings>
</userSettings>
</configuration>
序列化
DateTimeOffset
最可靠的方法是使用,它由标准序列化字符串“o”
指定
这使用了该标准,该标准与其他系统、语言、框架等高度互操作。您的价值如下:2013-02-22T14:39:06.0000000+00:00
.Net将使用此格式存储小数秒到7位小数
如果您可以显示一些关于如何存储和检索应用程序设置的代码,我可以告诉您在哪里指定格式字符串。在大多数情况下,它只是
.ToString(“o”)
根据您的回答,我为存储为字符串的值制作了一个包装器,而不是DateTimeOffset。请参阅我的编辑。谢谢这似乎是合理的。我对MSDN文档进行了深入研究,但似乎无法为应用程序设置指定格式字符串。这是疯狂的,他们使用默认格式,尤其是因为它的文化敏感。“o”
格式更安全。您是否计划支持多个windows用户?如果是这样的话,每个人都有自己的“最后检查时间”吗?还是在所有人之间共享?ApplicationSettingsBase(您的设置类派生自的类)的一个问题是,它不允许写入应用程序范围的设置(尽管存在解决方法)。@jerry my设置是用户范围的。没问题。谢谢你的邀请。
public DateTimeOffset LatestCheckTimestamp
{
get { return DateTimeOffset.Parse(LatestCheckTimestampString); }
set { LatestCheckTimestampString = value.ToString("o"); }
}
<configuration>
<userSettings>
<MyApp.Properties.Settings>
[...]
<setting name="LatestCheckTimestampString" serializeAs="String">
<value>2013-02-22T16:54:04.3647473+00:00</value>
</setting>
</MyApp.Properties.Settings>
</userSettings>
</configuration>
MyApp.Settings.Default.LatestCheckTimestamp = initialLatestCheckTimestamp;
MyApp.Settings.Default.Save();