Zoned dateTime到UTC时间 - LocalDateTimePattern抛出异常

时间:2013-05-28 07:36:47

标签: timezone nodatime

我正在尝试使用以下代码在NodaTime中使用LocalDateTime模式从分区日期时间获取UTC时间。

public string getUtcTimeFromZonedTime(string dateTimeString, string timeZoneID,
                                      string dateTimePattern, bool isDateTime)
{

    if (string.IsNullOrEmpty(dateTimePattern))
    {
        if (isDateTime)
        {
            dateTimePattern = "M/dd/yyyy HH:mm:ss tt";
        }
        else
        {
            dateTimePattern = "M/dd/yyyy";
        }
    }

    var pattern = LocalDateTimePattern.CreateWithInvariantCulture(dateTimePattern);

    var parseResult = pattern.Parse(dateTimeString);
    if (!parseResult.Success)
    {
        // throw an exception or whatever you want to do
    }

    var localDateTime = parseResult.Value;

    var timeZone = DateTimeZoneProviders.Tzdb[timeZoneID];

    // TODO: Consider how you want to handle ambiguous or "skipped" local date/time
    // values. For example, you might want InZoneStrictly, or provide your own custom
    // handler to InZone.
    var zonedDateTime = localDateTime.InZoneLeniently(timeZone);

    return zonedDateTime.ToDateTimeUtc().ToString();
}

在下面提到的情况下,我在解析过程中遇到异常 - 1)如果模式类似于“MM / dd / yyyy HH:mm:ss tt”,则DateTime字符串类似于“5/28/2013 1:02:ss PM” 2)如果模式类似于“MM-dd-yyyy HH:mm:ss tt”,则DateTime字符串类似于“5/28/2013 1:02:ss PM”

对于第一种情况,如果我将模式更改为“M / dd / yyyy HH:mm:ss tt”,它将起作用,但我最终会失去前导零。如果我将模式更改为“MM / dd / yyyy HH:mm:ss tt”,则第二种情况将起作用

有没有其他方法可以获取UTC值,或者我在这里做错了什么。

1 个答案:

答案 0 :(得分:0)

  

1)如果模式类似于“MM / dd / yyyy HH:mm:ss tt”,则DateTime字符串类似于“5/28/2013 1:02:ss PM”

是的,因为你已经指定你会给它一个两位数的小时,而你只给了一位数。请注意,如果您使用的是AM / PM指示符,则可能还需要h而不是H

  

2)如果模式类似于“MM-dd-yyyy HH:mm:ss tt”,则DateTime字符串类似于“5/28/2013 1:02:ss PM”

是的,因为您已指定希望-作为分隔符,但您在文本中使用/

我怀疑你想要:

dateTimePattern = "M/dd/yyyy h:mm:ss tt";

请注意,这与转换为UTC无关 - 它只是解析LocalDateTime导致您出现问题。