11

我正在读取一个包含日期的文本文件,并且我想将表示日期的字符串解析为 java 中的 Date 对象。我注意到的是操作很慢。为什么?有什么方法可以加速吗?我的文件看起来像:

2012-05-02 12:08:06:950, secondColumn, thirdColumn
2012-05-02 12:08:07:530, secondColumn, thirdColumn
2012-05-02 12:08:08:610, secondColumn, thirdColumn

我正在逐行读取文件,然后String从每一行获取日期,然后我将其解析为一个Date对象SimpleDateFormat,如下所示:

DataInputStream in = new DataInputStream(myFileInputStream);
BufferedReader  br = new BufferedReader(new InputStreamReader(in));
String strLine;

SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
while ((strLine = br.readLine()) != null)
{
    ....Do things....
    Date myDateTime = (Date)formatter.parse(myDateString);
    ...Do things....
}
4

3 回答 3

8

日期和时区的转换是昂贵的。如果您可以假设您的日期/时间彼此相似,那么您可以在分钟更改时转换日期和小时/分钟(或者只有日期,如果您使用 GMT)并自己生成秒。

这将parse每分钟调用一次。根据您的假设,您可以每小时或每天一次。

String pattern = "yyyy-MM-dd HH:mm";
SimpleDateFormat formatter = new SimpleDateFormat(pattern);
String lastTime = "";
long lastDate = 0;
while ((strLine = br.readLine()) != null) {
    String myDateString = strLine.split(", ")[0];
    if (!myDateString.startsWith(lastTime)) {
        lastTime = myDateString.substring(0, pattern.length());
        lastDate = formatter.parse(lastTime).getTime();
    }
    Date date = new Date(lastDate + Integer.parseInt(myDateString.substring(pattern.length() + 1).replace(":", "")));
}
于 2012-08-03T15:02:03.503 回答
4
于 2018-03-05T00:29:28.763 回答
2

我建议编写一个自定义解析器,它会更快。就像是:

Date parseYYYYMMDDHHMM(String strDate) {
   String yearString = strDate.substring(0, 4);
   int year = Integer.parseInt(yearString);
   ...

另一种方法是使用预先计算的日期时间哈希图(无毫秒)到 unix-timestamp。如果没有太多不同的日期(或者您可以在日期翻转后重新计算它),则将起作用。

于 2016-06-09T11:32:42.917 回答