以多种格式解析日期时间

Viv*_*ain 27 c# datetime

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

问题是,在调用此API时,调用者可以传递datetime3种不同的格式:

  1. long int - 例如1374755180
  2. 美国格式 - 例如"7/25/2013 6:37:31 PM"(as string)
  3. 时间戳格式 - 例如"2013-07-25 14:26:00"(as string)

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

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

所需的输出必须采用en-GB格式.

编辑:

我原本以为有一个if-else if-else块可以使用TryParse3次,其中一个else说无法解析字符串.这是最好的解决方案吗?或者有更好的解决方案吗?

请帮忙!

小智 28

你应该考虑要求一个时区.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...");
}
Run Code Online (Sandbox Code Playgroud)

编辑 正如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...");
}
Run Code Online (Sandbox Code Playgroud)

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

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 您可以合并#2和#3,因为`TryParseExact`可以接受一系列格式.并且时区不是*必需*,只是那些格式将具有`.Kind == DateTimeKinds.Unspecified`. (6认同)

Dar*_*bio 20

您正在寻找DateTime.ParseExact(MSDN文章)

您将在以下情况中使用哪种方式:

string[] formats= { "MM/dd/yyyy hh:mm:ss tt", "yyyy-MM-dd hh:mm:ss" }
var dateTime = DateTime.ParseExact("7/25/2013 6:37:31 PM", formats, new CultureInfo("en-GB"), DateTimeStyles.None);
Run Code Online (Sandbox Code Playgroud)

这允许您根据需要添加任意数量的DateTime格式,array并且该方法将在没有if... else语句的情况下进行转换.

如果您的整数是自Unix Epoch以来的秒数,您可以在Epoch的日期时间(1970年1月1日)中添加秒数(.Net没有开箱即用的方法,但逻辑是秒'时代'):

new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc).AddSeconds(seconds);
Run Code Online (Sandbox Code Playgroud)

这个问题.