一尘不染

解析多种格式的日期时间

c#

我已经创建了一个API端点。调用方可以使用POST传递相关参数的方法来调用API 。在参数中,有一个datetime格式格式的参数。

问题在于,调用此API时,调用者可能会datetime以3种不同的格式传递:

  1. long int -例如1374755180
  2. 美国格式-例如“ 2013年7月25日下午6:37:31”(如string
  3. 时间戳格式-例如“ 2013-07-25 14:26:00”(作为string

我必须解析该datetime值并将其转换为DateTimestring时间戳格式。

我已经尝试使用DateTime.TryParse()DateTime.Parse()Convert.ToDateTime()Convert.ToDouble(),但他们都不在肯定为我工作。

所需的输出必须为en-GB格式。

编辑:

我曾想过要if-else if- elseTryParse3次一起使用一个块else,说不能解析该字符串。这是最好的解决方案吗?还是有比这更好的解决方案?

请帮忙!


阅读 497

收藏
2020-05-19

共1个答案

一尘不染

您应该考虑要求时区。1不需要它,但是#2和#3需要它。

public DateTime ParseRequestDate()
{
    // https://stackoverflow.com/questions/2883576/how-do-you-convert-epoch-time-in-c

    CultureInfo enUS = new CultureInfo("en-US");

    var dt = "1374755180";
    //var dt = "7/25/2013 6:37:31 PM";
    //var dt = "2013-07-25 14:26:00";

    DateTime dateValue;
    long dtLong;

    // Scenario #1
    if (long.TryParse(dt, out dtLong))
        return dtLong.FromUnixTime();

    // Scenario #2
    if (DateTime.TryParseExact(dt, "MM/dd/yyyy hh:mm:ss tt", enUS, DateTimeStyles.None, out dateValue))
        return dateValue;

    // Scenario #3
    if (DateTime.TryParseExact(dt, "yyyy-MM-dd hh:mm:ss", enUS, DateTimeStyles.None, out dateValue))
        return dateValue;

    throw new SomeException("Don't know how to parse...");
}

编辑 正如Matt Johnson指出的那样,DateTime.TryParseExact接受一个格式字符串数组。2&3可能会凝聚。

public DateTime ParseRequestDate()
{
    // https://stackoverflow.com/questions/2883576/how-do-you-convert-epoch-time-in-c

    CultureInfo enUS = new CultureInfo("en-US");

    var dt = "1374755180";
    //var dt = "7/25/2013 6:37:31 PM";
    //var dt = "2013-07-25 14:26:00";

    DateTime dateValue;
    long dtLong;

    // Scenario #1
    if (long.TryParse(dt, out dtLong))
        return dtLong.FromUnixTime();

    // Scenario #2 & #3
    var formatStrings = new string[] { "MM/dd/yyyy hh:mm:ss tt", "yyyy-MM-dd hh:mm:ss" };
    if (DateTime.TryParseExact(dt, formatStrings, enUS, DateTimeStyles.None, out dateValue))
        return dateValue;

    throw new SomeException("Don't know how to parse...");
}

我从另一个问题借来的时代转换。 (扩展方法)

public static class MyExtensions
{
    public static DateTime FromUnixTime(this long unixTime)
    {
        var epoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
        return epoch.AddSeconds(unixTime);
    }
}
2020-05-19