在C#中将14个数字转换为日期时间

3

我是一名有用的助手,可以为您翻译文本。

我有一个14位数字,其中包含AM/PM的2个字符,我想将它们转换为dateTime。

例如:515201483742AM

我尝试了这段代码:

DateTime result = 
DateTime.ParseExact(dateString, "Mdyyyyhmmsstt",
 CultureInfo.CreateSpecificCulture("en-US"));

输出格式错误

其中515201483742AM表示2014年5月15日上午8点37分42秒

月份用M表示,没有前导零

日期也是一样,用d表示,没有前导零

小时同样如此,用tt表示AM


1
不确定,但可能无法使用传统的Try/Parse方法解析它。同时,编写自定义解析器也会非常复杂。能否要求提供一个不太含糊的输入字符串? - Steve
1
请提供当前日期和时间以您的格式?那会是什么样子? - Frank
3
我敢说这是不可能的,例如,如果你有一个以“115”开头的字符串,就无法判断它是1月15日还是11月5日。 - Grx70
3
在你的时间格式中,111201111111AM 是什么时间?是11月11日凌晨1点11分吗?还是1月1日上午11点01分?如果你需要一个紧凑的时间格式,请使用 ISO 8601 的某个变体,并保持字段固定:20110111110100 明确表示为 2011年1月11日上午11:01(长度为14位)。 - Jeroen Mostert
我认为这无论如何都做不到,谢谢大家的帮助。 - M.Ghandour
2个回答

2

如果不更改字符串,就无法解析它,因为M格式说明符可以是两位数字,这将导致将51解析为月份。这就是为什么你的操作会抛出FormatException异常。与h格式说明符相同。

这就是为什么我们需要将你的字符串从515201483742AM更改为05152014083742AM,以便提供M格式说明符将映射到05h格式说明符将映射到08

你可以使用类似于1的方法;

public static DateTime? ParseDate_Mdyyyyhmmsstt(string date)
{
    if (date == null)
        return null;
    if (date.Length < 14)
        return null;
    if (date.Length == 14)
        date = date.Insert(0, "0").Insert(8, "0");
    DateTime dt;
    if (DateTime.TryParseExact(date, "Mdyyyyhmmsstt",
                               CultureInfo.InvariantCulture,
                               DateTimeStyles.None, out dt))
        return dt;
    return null;
}

并且像这样调用:

var dt = ParseDate_Mdyyyyhmmsstt("515201483742AM");
Console.WriteLine(dt.Value); // 15.05.2014 08:37:42

1:我知道这不是一个优雅的解决方案,但在您的情况下当月和小时部分只有1位数字时它可以工作。

阅读:C#字符串转换为DateTime


1
当输入为“1215201483742AM”(即15.12.2014 08:37:52)时,它返回null。虽然对于这个特定的输入有用,但只对此有效。 - Grx70
你说得没错,但是如果输入的长度为15,你怎么知道是应该跳过 date.Insert(0, "0") 还是 .Insert(8, "0") 呢? - Grx70
@Grx70 我做不到,也没有人能够做到。解析操作的输入格式是 OP 负责知道的,而不是我。当月份和小时部分为1位数字时,我建议他使用特定的格式作为答案。 - Soner Gönül
它并不是固定的,这些是一些随机值:1272014105547AM - 3252014113727AM - 526201493920PM - 9112014110901AM - M.Ghandour
还有像Jeroen和Grx70在评论中提到的,这个问题该如何解决? - M.Ghandour
显示剩余3条评论

0

使用双引号的 "MM" 和 "dd" 代替单引号的 "M" 和 "d"

DateTime result = DateTime.ParseExact(dateString,"MMddyyyyhmmsstt",CultureInfo.CreateSpecificCulture("en-US"));

它会工作。


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