.net TryParseExact不转换带时区的字符串

vmpqdwk3  于 2023-05-01  发布在  .NET
关注(0)|答案(2)|浏览(140)

我有一个字符串“2023-04- 13 T07:03:20-03:00”,我想转换为DateTime,格式为“yyyy-MM-ddTHH:mm:ss”**,所以我使用TryParseExact方法,但我只收到false作为返回。
这是我正在研究的代码。当变量不带时区时,转换正常进行,但是带时区时,格式无效。
在文档中,我没有发现任何东西说我这样做是错误的。
我也试过将日期样式设置为AssumeUniversal,它不起作用。
如果有人能给予我一些澄清,我将不胜感激。

using System;
using System.Linq;
using System.Collections.Generic;
using System.Globalization;
                    
public class Program
{
    public static void Main()
    {
        var formats = new[]{
            "o",
                        "s",
                        "t", "T",
                        "M/yy",
                        "dd-MM-yy",
        "yyyy-MM-ddTHH:mm:ss",};
        
        foreach(var format in formats)
        {
            DateTime dat1;
            DateTime dat2;
            Console.WriteLine(format);
            Console.WriteLine("");
            Console.WriteLine(DateTime.TryParseExact("2023-04-13T07:03:20-03:00", formats, CultureInfo.InvariantCulture, DateTimeStyles.None, out dat1) ? dat1.ToString(format) : "false");
            Console.WriteLine(DateTime.TryParseExact("2023-04-13T07:03:20", formats, CultureInfo.InvariantCulture, DateTimeStyles.None, out dat2) ? dat2.ToString(format) : "false");
            Console.WriteLine("");
            Console.WriteLine("--------------------");
        }
    }
}

结果:

假2023-04- 13 T07:03:20。0000000
s
假2023-04- 13 T07:03:20
t
假7:03 AM
T型
假7:03:20 AM
月/年
错误4/23
年-月-日
13-04-23错误
yyyy-MM-ddTHH:mm:ss
假2023-04- 13 T07:03:20

lb3vh1jj

lb3vh1jj1#

应在格式中包含时区偏移量。你可以用“K”来表示。

var formats = new[] { "yyyy-MM-ddTHH:mm:ssK" };
v64noz0r

v64noz0r2#

用于分析日期和时间字符串“2023-04- 13 T07:03:20-03:00”的格式“yyyy-MM-ddTHH:mm:ss”是正确的。但是,您面临的问题与输入字符串中的时区信息有关。
TryParseExact方法无法识别时区信息“-03:00”,该方法需要“+/-HH:mm”格式的时区偏移。要解决这个问题,您可以修改输入字符串,在尝试解析它之前将冒号“:”替换为空字符串。
下面是应该可以工作的代码的更新版本:

using System;
using System.Linq;
using System.Collections.Generic;
using System.Globalization;

public class Program
{
    public static void Main()
    {
        var formats = new[]{
            "o",
            "s",
            "t", "T",
            "M/yy",
            "dd-MM-yy",
            "yyyy-MM-ddTHH:mm:ss",
        };

        var input = "2023-04-13T07:03:20-03:00".Replace(":", "");
        
        foreach(var format in formats)
        {
            DateTime dat1;
            Console.WriteLine(format);
            Console.WriteLine("");
            Console.WriteLine(DateTime.TryParseExact(input, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out dat1) ? dat1.ToString(format) : "false");
            Console.WriteLine("");
            Console.WriteLine("--------------------");
        }
    }
}

在更新后的代码中,我们首先将输入字符串中的冒号“:”替换为空字符串。然后,我们遍历格式列表,并尝试使用每种格式解析输入字符串。输出现在应该以“yyyy-MM-ddTHH:mm:ss”格式显示预期的日期和时间值。

相关问题