Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/324.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# 如何解析和生成ISO 8601格式的DateTime对象_C#_.net_Datetime_Iso8601 - Fatal编程技术网

C# 如何解析和生成ISO 8601格式的DateTime对象

C# 如何解析和生成ISO 8601格式的DateTime对象,c#,.net,datetime,iso8601,C#,.net,Datetime,Iso8601,有一个SOAPWeb服务以以下格式向我发送datetime对象 2016-03-29T12:20:35.093-05:00 这是2016年3月29日。时间:12:20:35.093(GMT-5) 我希望能够创建一个DateTime对象,如下所示: DateTime.Now 获取上述格式的字符串表示形式,以及反向操作,从上面给出的字符串创建日期时间 为了创建日期,我尝试了以下操作: new DateTime(2016, 3, 29, 12, 20, 35, 093, DateTimeKind.

有一个SOAPWeb服务以以下格式向我发送datetime对象

2016-03-29T12:20:35.093-05:00
这是2016年3月29日。时间:12:20:35.093(GMT-5)

我希望能够创建一个
DateTime
对象,如下所示:

DateTime.Now
获取上述格式的字符串表示形式,以及反向操作,从上面给出的字符串创建日期时间

为了创建日期,我尝试了以下操作:

new DateTime(2016, 3, 29, 12, 20, 35, 093, DateTimeKind.Utc)
但是,我不知道如何在那里指定GMT-5

我也不知道如何将日期时间转换为指定的字符串格式

使用Nate的代码,我正在做以下工作:

var d = new DateTimeOffset(2016, 3, 29, 12, 20, 35, 93, TimeSpan.FromHours(-3));

FormatIso8601(d)
然而,这个电话正在回复:“2016-03-29T15:20:35Z”,而不是:

"2016-03-29T12:20:35.093-03:00"
这就是我真正需要的

我认为这是可行的:

        d.ToString("yyyy-MM-ddTHH:mm:ss.fffzzz")

您描述的格式是

由于您使用的是包含时区组件的时间戳,因此我强烈建议使用
DateTimeOffset
而不是
DateTime
。这让事情变得容易多了

要为给定的日期、时间和时区偏移创建
DateTimeOffset
,请使用以下语法:

var date = new DateTimeOffset(2016, 3, 29, 12, 20, 35, 93, TimeSpan.FromHours(-5));
// March 29, 2016 at 12:20:35.93 GMT-5
此代码将把
日期时间偏移设置为ISO 8601:

public static string FormatIso8601(DateTimeOffset dto)
{
    string format = dto.Offset == TimeSpan.Zero
        ? "yyyy-MM-ddTHH:mm:ss.fffZ"
        : "yyyy-MM-ddTHH:mm:ss.fffzzz";

    return dto.ToString(format, CultureInfo.InvariantCulture);
}
并且,要将字符串解析回
DateTimeOffset

public static DateTimeOffset ParseIso8601(string iso8601String)
{
    return DateTimeOffset.ParseExact(
        iso8601String,
        new string[] { "yyyy-MM-dd'T'HH:mm:ss.FFFK" },
        CultureInfo.InvariantCulture,
        DateTimeStyles.None);
}

如果您必须返回到
日期时间
,则可以从
日期时间偏移量
获取此信息。属性。

一种更简单的方法是在带有“o”参数的DateTimeOffset上使用ToString方法。这会自动以ISO8601格式打印日期

DateTimeOffset.Now.ToString("o");
静态解析方法还能够正确解析ISO8601格式的日期

DateTimeOffset.Parse("2016-25-12T20:45:30.3124+01:00");
DateTimeOffset.Parse("2016-25-12T20:45:30.3124Z");

简单回答:
DateTime.UtcNow.ToString(“o”)

您是否尝试使用
DateTime.Parse
?是的,但我根本找不到方法。否则我就不会来问你需要解释你能做什么和不能做什么。给我们看看你做过什么。我刚刚补充了我做过的。非常感谢。这样做安全吗?ParseIso8601(myDate).DateTime是否获取DateTime对象?在我的系统中,如果可能的话,我需要datetimes而不是DateTimeOffset。感谢这是可能的,但要注意意外的副作用:你得到的时间取决于你机器的本地时区。如果要避免这种转换,UtcDateTime将始终返回UTC时间。因此,不可能获得一个DateTime对象,该对象表示我在字符串中传递给ParseIso8601的同一准确时间,即“准确时间”,在哪个时区?字符串可能表示与计算机所在时区不同的时区。当然-UtcDateTime将是明确的。