gpt4 book ai didi

c# - `XmlConvert.ToDateTime(String)` 和 `XmlConvert.ToString(DateTime)` 输出不一致

转载 作者:数据小太阳 更新时间:2023-10-29 02:24:44 25 4
gpt4 key购买 nike

我在使用 XmlConvertDateTime 时遇到问题。

当使用 XmlConvert.ToDateTime(String) 转换一些字符串时,然后使用 XmlConvert.ToString(DateTime) 将结果 DateTime 转换回字符串,并且结果字符串与原始字符串不同,并且取决于本地时区。

以下控制台应用程序代码演示了该问题:

using System;
using System.Xml;

namespace DateTimeXmlConvertTest
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Original Value\t\t\t\tNew Value");
Console.WriteLine("--------------\t\t\t\t---------");

for (int i = -12; i <= 12; i++)
{
string sign = i < 0 ? "" : "+";

string originalString = "2011-10-01T01:18:54.6652000" + sign + i.ToString("D2") + ":00";
DateTime now = XmlConvert.ToDateTime(originalString);
string newValue = XmlConvert.ToString(now);
Console.WriteLine(originalString + "\t" + newValue);
}
}
}
}

在我的 PC(Windows 7 x64,TimeZone UTC+02:00 with Daylight)上运行这个程序时,我有以下输出:

Original Value                          New Value
-------------- ---------
2011-10-01T01:18:54.6652000-12:00 2011-10-01T16:18:54.6652000+03:00
2011-10-01T01:18:54.6652000-11:00 2011-10-01T15:18:54.6652000+03:00
2011-10-01T01:18:54.6652000-10:00 2011-10-01T14:18:54.6652000+03:00
2011-10-01T01:18:54.6652000-09:00 2011-10-01T13:18:54.6652000+03:00
2011-10-01T01:18:54.6652000-08:00 2011-10-01T12:18:54.6652000+03:00
2011-10-01T01:18:54.6652000-07:00 2011-10-01T11:18:54.6652000+03:00
2011-10-01T01:18:54.6652000-06:00 2011-10-01T10:18:54.6652000+03:00
2011-10-01T01:18:54.6652000-05:00 2011-10-01T09:18:54.6652000+03:00
2011-10-01T01:18:54.6652000-04:00 2011-10-01T08:18:54.6652000+03:00
2011-10-01T01:18:54.6652000-03:00 2011-10-01T07:18:54.6652000+03:00
2011-10-01T01:18:54.6652000-02:00 2011-10-01T06:18:54.6652000+03:00
2011-10-01T01:18:54.6652000-01:00 2011-10-01T05:18:54.6652000+03:00
2011-10-01T01:18:54.6652000+00:00 2011-10-01T04:18:54.6652000+03:00
2011-10-01T01:18:54.6652000+01:00 2011-10-01T03:18:54.6652000+03:00
2011-10-01T01:18:54.6652000+02:00 2011-10-01T02:18:54.6652000+03:00
2011-10-01T01:18:54.6652000+03:00 2011-10-01T01:18:54.6652000+03:00
2011-10-01T01:18:54.6652000+04:00 2011-10-01T00:18:54.6652000+03:00
2011-10-01T01:18:54.6652000+05:00 2011-09-30T23:18:54.6652000+03:00
2011-10-01T01:18:54.6652000+06:00 2011-09-30T22:18:54.6652000+03:00
2011-10-01T01:18:54.6652000+07:00 2011-09-30T21:18:54.6652000+03:00
2011-10-01T01:18:54.6652000+08:00 2011-09-30T20:18:54.6652000+03:00
2011-10-01T01:18:54.6652000+09:00 2011-09-30T19:18:54.6652000+03:00
2011-10-01T01:18:54.6652000+10:00 2011-09-30T18:18:54.6652000+03:00
2011-10-01T01:18:54.6652000+11:00 2011-09-30T17:18:54.6652000+03:00
2011-10-01T01:18:54.6652000+12:00 2011-09-30T16:18:54.6652000+03:00

在使用不同的字符串转换结果时怎么可能?

有没有办法让它在这种情况下输出原始字符串?

谢谢。

最佳答案

首先,XmlConvert.ToDateTime(String)过载已过时。该文档明确指定您应该使用 XmlConvert.ToDateTime(String, XmlDateTimeSerializationMode)反而。有了它,您就可以指定 XmlDateTimeSerializationMode ,记录如下:

One of the XmlDateTimeSerializationMode values that specify whether the date should be converted to local time or preserved as Coordinated Universal Time (UTC), if it is a UTC date.

当您拥有 DateTime 的实例时,它的构造方式(例如时区)将丢失。时区将从原始字符串中正确解析并转换为 UTC 或本地时间,但它的转换来源会在此过程中丢失。

如果您想保留时区偏移量,请使用 DateTimeOffset类(class)。它的行为类似于 DateTime,但保留了创建它时的时区偏移量。 XmlConvert 有一个 ToDateTimeOffset完全符合您要求的方法。这是一个工作示例:

Console.WriteLine("{0,33}\t{1,33}", "Original Value", "New Value");
Console.WriteLine("{0}\t{0}", new String('-', 33));

for (int i = -12; i <= 12; i++)
{
string sign = i < 0 ? "" : "+";
string originalString = String.Format(
"2011-10-01T01:18:54.6652123{0}{1:D2}:00", sign, i);
DateTimeOffset dateTime = XmlConvert.ToDateTimeOffset(originalString);
string newString = XmlConvert.ToString(dateTime);
Console.WriteLine("{0}\t{1}", originalString, newString);
}

您现在遇到的唯一问题是 +00:00 将被序列化为 Z,如果您格式化 newString 可以避免这种情况> 你自己,像这样:

string newString = String.Format("{0:yyyy-MM-ddTHH:mm:ss.fffffffzzz}", dateTime);

关于c# - `XmlConvert.ToDateTime(String)` 和 `XmlConvert.ToString(DateTime)` 输出不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7787666/

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