使用 DateTimeOffset.TryParseExact 遇到 AM/PM 问题

Tom*_*ian 3 c# datetimeoffset

我有一些代码想要测试有效时间,出于某种原因,它适用于 PM 的日期,但不适用于 AM。

所以我采用与这种格式相对应的格式:

2018/6/1 下午 12:00:00

然而,出于某种原因,当它是 PM 时,这很好用,但是当我用 AM 替换它时,它就坏了。我接受它命中的可接受格式的格式是:

M/d/yyyy HH:mm:ss tt

下面没有说它是假的:

      DateTimeOffset dateTimeResult;
        var acceptableFormats = new string[] {
                            "yyyy-MM-dd'T'HH:mm:ss.FFFK",
                            "M/d/yyyy HH:mm:ss",
                            "MM/dd/yyyy HH:mm:ss",
                            "M/d/yyyy HH:mm:ss tt",
                            "MM/dd/yyyy HH:mm:ss tt",
                            "yyyy-MM-dd' 'HH:mm:ss.FFFK",
                            "yyyy-MM-dd'T'HH:mm:ssK",
                            "yyyy-MM-dd' 'HH:mm:ssK",
                            "yyyy-MM-dd'T'HH:mm:ss",
                            "yyyy-MM-dd' 'HH:mm:ss",
                            "yyyy-MM-dd'T'HH:mm",
                            "yyyy-MM-dd' 'HH:mm",
                            "yyyy-MM-dd'T'HH",
                            "yyyy-MM-dd' 'HH",
                            "yyyy-MM-dd",
                            "yyyy-MM-dd",
                            "yyyyMMdd",
                            "MM/dd/yyyy",
                            "M/d/yyyy",
                            "yyyy-MM",
                            "yyyy" };
        DateTimeOffset dateTimeResult;
        var timeOffset = DateTimeOffset.TryParseExact("6/1/2018 12:00:00 AM", acceptableFormats, CultureInfo.InvariantCulture, DateTimeStyles.None, out dateTimeResult);
Run Code Online (Sandbox Code Playgroud)

这个作品说的是真的:

      DateTimeOffset dateTimeResult;
        var acceptableFormats = new string[] {
                            "yyyy-MM-dd'T'HH:mm:ss.FFFK",
                            "M/d/yyyy HH:mm:ss",
                            "MM/dd/yyyy HH:mm:ss",
                            "M/d/yyyy HH:mm:ss tt",
                            "MM/dd/yyyy HH:mm:ss tt",
                            "yyyy-MM-dd' 'HH:mm:ss.FFFK",
                            "yyyy-MM-dd'T'HH:mm:ssK",
                            "yyyy-MM-dd' 'HH:mm:ssK",
                            "yyyy-MM-dd'T'HH:mm:ss",
                            "yyyy-MM-dd' 'HH:mm:ss",
                            "yyyy-MM-dd'T'HH:mm",
                            "yyyy-MM-dd' 'HH:mm",
                            "yyyy-MM-dd'T'HH",
                            "yyyy-MM-dd' 'HH",
                            "yyyy-MM-dd",
                            "yyyy-MM-dd",
                            "yyyyMMdd",
                            "MM/dd/yyyy",
                            "M/d/yyyy",
                            "yyyy-MM",
                            "yyyy" };
        DateTimeOffset dateTimeResult;
        var timeOffset = DateTimeOffset.TryParseExact("6/1/2018 12:00:00 PM", acceptableFormats, CultureInfo.InvariantCulture, DateTimeStyles.None, out dateTimeResult);
Run Code Online (Sandbox Code Playgroud)

gun*_*171 5

您遇到此问题的原因是您的格式要求使用 24 小时制组件。12, 在 24 小时制中,始终表示“中午”。你不能有“noon AM”,因为AM 只适用于午夜和中午(独家)之间的时间

由于输入格式无效,此行引发异常:

DateTimeOffset.ParseExact("6/1/2018 12:00:00 AM", "M/d/yyyy HH:mm:ss tt", 
    CultureInfo.InvariantCulture)
Run Code Online (Sandbox Code Playgroud)

如果我更改HHhh,则它有效:

DateTimeOffset.ParseExact("6/1/2018 12:00:00 AM", "M/d/yyyy hh:mm:ss tt", 
    CultureInfo.InvariantCulture)

// returns a valid DateTimeOffset object, which in
// my culture is displayed as '6/1/2018 12:00:00 AM -04:00'
// (I happen to be in -4 UTC)
Run Code Online (Sandbox Code Playgroud)