Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在项目设置中保存DateTimeOffset设置时丢失精度_C#_Serialization_Application Settings_Datetimeoffset - Fatal编程技术网

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();