用Java解析YYYYMMdd日期的最快方法

use*_*001 10 java parsing date date-parsing

在解析YYYYMMdd日期时,例如2012年4月5日的20120405,最快的方法是什么?

int year = Integer.parseInt(dateString.substring(0, 4));
int month = Integer.parseInt(dateString.substring(4, 6));
int day = Integer.parseInt(dateString.substring(6));
Run Code Online (Sandbox Code Playgroud)

int date = Integer.parseInt(dateString)
year = date / 10000;
month = (date % 10000) / 100; 
day = date % 100;
Run Code Online (Sandbox Code Playgroud)

月份的mod 10000是因为mod 10000导致MMdd而结果/ 100是MM

在第一个例子中,我们做3个String操作,3个"解析为int",在第二个例子中,我们通过modulo做很多事情.

什么更快?有更快的方法吗?

the*_*e19 33

SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd");
Date date = format.parse("20120405");
Run Code Online (Sandbox Code Playgroud)

  • 这是要走的路,解析日期字符串应该需要性能优化,除非你已经确定你在循环中为每个请求或类似的事情做了大概1000万次......(在这种情况下,你应该想知道为什么). (7认同)

Gra*_*ray 14

如下所示,只有在查看数百万次迭代时,日期处理的性能才有意义.相反,您应该选择易于阅读和维护的解决方案.

虽然你可以使用SimpleDateFormat,但它不是可重入的,所以应该避免.最好的解决方案是使用伟大的Joda时间类:

private static final DateTimeFormatter DATE_FORMATTER = new DateTimeFormatterBuilder()
     .appendYear(4,4).appendMonthOfYear(2).appendDayOfMonth(2).toFormatter();
...
Date date = DATE_FORMATTER.parseDateTime(dateOfBirth).toDate();
Run Code Online (Sandbox Code Playgroud)

如果我们谈论你的数学函数,首先要指出的是你的数学代码中存在我修复过的错误.这是手工做的问题.也就是说,处理字符串一次的将是最快的.快速测试运行表明:

year = Integer.parseInt(dateString.substring(0, 4));
month = Integer.parseInt(dateString.substring(4, 6));
day = Integer.parseInt(dateString.substring(6));
Run Code Online (Sandbox Code Playgroud)

需要大约800毫秒时:

int date = Integer.parseInt(dateString);
year = date / 10000;
month = (date % 10000) / 100; 
day = date % 100;
total += year + month + day;
Run Code Online (Sandbox Code Playgroud)

需要约400毫秒.

然而......再次......你需要考虑到这是经过1000万次迭代之后.这是过早优化的完美示例.我会选择最易读且最容易维护的那个.这就是为什么Joda的时间回答是最好的.


Hon*_*oki 5

我做了一个快速基准测试,其中两种方法各执行了100万次.Dilum Ranatunga预测,结果清楚地表明模数法更快.

t.startTiming();
for(int i=0;i<1000000;i++) {
    int year = Integer.parseInt(dateString.substring(0, 4));
    int month = Integer.parseInt(dateString.substring(4, 6));
    int day = Integer.parseInt(dateString.substring(6));
}
t.stopTiming();
System.out.println("First method: "+t.getElapsedTime());

Time t2 = new Time();
t2.startTiming();
for(int i=0;i<1000000;i++) {
    int date = Integer.parseInt(dateString);
    int y2 = date / 1000;
    int m2 = (date % 1000) / 100;
    int d2 = date % 10000;
}
t2.stopTiming();
System.out.println("Second method: "+t2.getElapsedTime());
Run Code Online (Sandbox Code Playgroud)

结果不是(以毫秒为单位).

First method: 129
Second method: 53
Run Code Online (Sandbox Code Playgroud)