错误提示:“字符串未被识别为有效的日期时间格式”

5

我有以下两个字符串:

  • Test1 = "2020-01-29T00:00:00Z"

  • Test2 = "29/01/2020 00:00:00"

我需要进行以下比较:

(DateTime.ParseExact(Test2.ToString(), "dd/M/yyyy hh:mm:ss tt", CultureInfo.InvariantCulture).ToString("yyyy'-'MM'-'dd'T'00':'00':'00'Z'") != (DateTime.ParseExact(Test1["ProjectDateSinged"].ToString(), "yyyy'-'MM'-'dd'T'00':'00':'00'Z'", CultureInfo.InvariantCulture)).ToString()))

但这会引发以下异常:

错误“字符串无法识别为有效的 DateTime”

请问有人能找出我的代码有什么问题吗?


2
尝试使用MM代替M表示月份。 - Pavel Anikhouski
1
这个回答解决了你的问题吗?Datetime格式问题:字符串无法识别为有效的DateTime - Ajoe
@PavelAnikhouski 我尝试了这个,但仍然会得到相同的错误。 - John John
@testtest,请看一下我的回答。 - Pavel Anikhouski
我认为,对于那些“为什么我的DateTime.ParseExact无法解析这个字符串”问题,当格式不完全匹配时,可能应该有一个规范的重复关闭问题目标。 - Lasse V. Karlsen
3个回答

4

将我的评论扩展为答案,您应该稍微更新格式字符串。对于Test2,您应该使用dd/MM/yyyy hh:mm:ss格式。

根据自定义日期和时间格式字符串MM用于月份数字从0112M用于112的月份数字。您有01个月份数字,因此应使用MM

您的日期中也没有AM / PM表示,因此也不需要tt

然后您就可以解析Test2为日期。

var Test2 = "29/01/2020 00:00:00";
var result = DateTime.ParseExact(Test2, "dd/MM/yyyy hh:mm:ss", CultureInfo.InvariantCulture);

对于Test1,您可以使用包括时区信息的日期格式yyyy-MM-ddThh:mm:ssK(解析日期)或不包括时区信息的日期格式yyyy-MM-ddThh:mm:ss'Z'
要比较日期,您无需将其转换回字符串。您可以使用DateTime结构体的Date属性获取日期组件。下面的代码返回true
var result = DateTime.ParseExact(Test1, "yyyy-MM-ddThh:mm:ss'Z'", CultureInfo.InvariantCulture).Date ==
             DateTime.ParseExact(Test2, "dd/MM/yyyy hh:mm:ss", CultureInfo.InvariantCulture).Date;

此外,仅通过比较两个 DateTime 实例即可。
var result = DateTime.ParseExact(Test1, "yyyy-MM-ddThh:mm:ss'Z'", CultureInfo.InvariantCulture) ==
             DateTime.ParseExact(Test2, "dd/MM/yyyy hh:mm:ss", CultureInfo.InvariantCulture);

我尝试用MM替换M,但仍然出现相同的错误。 - John John
@testtest,你也应该删除 tt,正如答案中所述。请检查一下。 - Pavel Anikhouski
好的,谢谢。但我不确定为什么这个 (DateTime.ParseExact(Test1["ProjectDateSinged"].ToString(), "yyyy'-'MM'-'dd'T'00':'00':'00'Z'", CultureInfo.InvariantCulture)).ToString()) 会返回日期 29/01/2020 00:00:00 - John John
由于您在使用'引号时跳过了时间组件,因此@testtest。要获取正确的日期,您需要使用yyyy-MM-ddThh:mm:ss'Z'(省略时区)或yyyy-MM-ddThh:mm:ssK(使用时区)。 - Pavel Anikhouski
我是指 (DateTime.ParseExact(Test1["ProjectDateSinged"].ToString(), "yyyy'-'MM'-'dd'T'00':'00':'00'Z'", CultureInfo.InvariantCulture)).ToString()) 应该返回以下字符串 2020-01-29T00:00:00z 而不是 29/01/2020 00:00:00.. 这样正确吗? - John John
@testtest返回1/29/2020 12:00:00 AM(至少在我的端口)。解析期间省略了“z”。不清楚为什么需要将日期转换为字符串并进行比较。您可以使用日期时间的“Date”属性获取日期组件并进行比较。 - Pavel Anikhouski

1
        string Test1 = "2020-01-29T00:00:00Z";

        string Test2 = "29/01/2020 00:00:00";


        DateTime dt = Convert.ToDateTime(Test1, CultureInfo.InvariantCulture);

       MessageBox.Show("" + dt.ToString("yyyy-MM-ddT00:00:00Z"));

使用了这段代码后成功运行。

0
通过查看您的示例,格式如下... 您可以通过指定格式编写通用方法。 就像以下这样 -
private static DateTime ParseDate(string providedDate)
{
    DateTime validDate;
    string[] formats = {  "dd/MM/yyyy hh:mm:ss", "yyyy-MM-dd'T'hh:mm:ss'Z'" };
    var dateFormatIsValid = DateTime.TryParseExact(
        providedDate,
        formats,
        CultureInfo.InvariantCulture,
        DateTimeStyles.None,
        out validDate);
    return dateFormatIsValid ? validDate : DateTime.MinValue;
}

调用此方法来解析字符串

 var test1 = ParseDate("2020-01-29T00:00:00Z");
 var test2 = ParseDate("29/01/2020 00:00:00");

 Console.WriteLine(test1 == test2); // result TRUE

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接