将整数值解析为日期时间

本文关键字:日期 时间 整数 | 更新日期: 2023-09-27 18:18:43

我把日期表示为整数,如20140820,我想将其解析为日期时间,如2014.08.20。

我是否需要使用 index 解析每个整数值 (2014((08((02(,还是有更简单的方法?

将整数值解析为日期时间

如果您的CurrentCulture支持yyyyMMdd格式作为标准日期和时间格式,则可以使用DateTime.Parse方法,例如;

int i = 20140820;
DateTime dt = DateTime.Parse(i.ToString());

如果不支持,则需要使用DateTime.ParseExactDateTime.TryParseExact方法将其解析为自定义日期和时间格式。

int i = 20140820;
DateTime dt;
if(DateTime.TryParseExact(i.ToString(), "yyyyMMdd", 
                          CultureInfo.InvariantCulture,
                          DateTimeStyles.None, out dt))
{
    Console.WriteLine(dt);
}

然后,您可以使用.ToString()方法格式化DateTime,例如;

string formattedDateTime = dt.ToString("yyyy.MM.dd", CultureInfo.InvariantCulture);

最简单和最高性能的方法是:

int date = 20140820;
int d = date % 100;
int m = (date / 100) % 100;
int y = date / 10000;
var result = new DateTime(y, m, d);

试试这个:-

string time = "20140820";
DateTime theTime= DateTime.ParseExact(time,
                                    "yyyyMMdd",
                                    CultureInfo.InvariantCulture,
                                    DateTimeStyles.None);

string str = "20140820";
string[] format = {"yyyyMMdd"};
DateTime date;
DateTime.TryParseExact(str, 
                          format, 
                          System.Globalization.CultureInfo.InvariantCulture,
                          System.Globalization.DateTimeStyles.None, 
                          out date))

现在date变量将具有必需的converted date of string '20140820'

int sampleDate = 20140820;
var dateFormat = DateTime.ParseExact(sampleDate.ToString(), "yyyyMMdd",
     CultureInfo.InvariantCulture).ToString("yyyy.MM.dd");

结果:

2014年08月20

因此,我们有两个相互竞争的实现,

using System;
using System.Globalization;
                    
public class Program
{
    public static void Main()
    {
        int i = 20140820;
        Console.WriteLine($"StringParse:{StringParse.Parse(i)}");
        Console.WriteLine($"MathParse:{MathParse.Parse(i)}");
    }
}
public static class StringParse
{
    public static DateTime Parse(int i)
    {
        return DateTime.ParseExact(
            i.ToString().AsSpan(),
            "yyyyMMdd".AsSpan(),
            CultureInfo.InvariantCulture);
    }
}
public static class MathParse
{
    public static DateTime Parse(int i)
    {
        return new DateTime(
                Math.DivRem(Math.DivRem(i, 100, out var day), 100, out var month),
                month,
                day);
    }
}

字符串方法可能更安全,并且可能更好地处理边缘情况。两者都会很快,不太可能成为性能瓶颈,但我未经测试的断言是数学方法可能具有更好的性能。