java - 将时间戳转换为自纪元以来的毫秒数

标签 java timestamp jodatime simpledateformat epoch

目前我正在逐行读取数据文件。每行都有一个格式为 dd/MM/yyyy HH:mm:ss" 的时间戳 我需要将其转换为自纪元以来的毫秒数。我尝试了两种方式

1>使用标准库

timestamp  = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss", Locale.ENGLISH).parse(ddMMyyyy + " " + HHmmss);
return timestamp.getTime();

2> 这是使用 Joda-Time 库

jiffy = format.parseMillis(ddMMyyyy + " " + HHmmss);

分析后,我发现方法一非常昂贵,而方法二比第一种便宜一点,但仍然很昂贵。第一个需要大约 1600 毫秒的 CPU 时间,第二个需要 1100 毫秒的 CPU 时间。

问题-

1> 有没有更好的库,又不是那么贵?

2> 如果没有标准库,有人可以指点我转换逻辑吗?我试过谷歌搜索但没有成功。这个网站上的公式很少,但它们不起作用,或者让我们称之为它们不够简单。

谢谢

**

添加问题的更多细节

**

好的..在此处添加更多详细信息。 测试运行是针对 1000 万条记录。每行都有时间戳,需要转换为从纪元开始的毫秒数。

这是我尝试过的三个版本的代码。

1> 使用 Joda-Time - 迄今为止最好的结果,但不能接受。它花费了 26.9% 的时间在时间​​转换上。

long jiffy = 0;
public double getTime( String ddMMyyyy, String HHmmss) throws ParseException
{       
    jiffy = format.parseMillis(ddMMyyyy + " " + HHmmss);
    return jiffy/1000;
}

这是分析 http://postimg.org/image/bvrt3esgr/

2> 带有 SimpleTimeFormat java 类。 如果一个人再次使用同一个对象,则需要 36.1% 的时间来完成此任务。

private long timestamp;
public static final SimpleDateFormat SDF = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss",Locale.ENGLISH);
long jiffy = 0;

public double getTime( String ddMMyyyy, String HHmmss) throws ParseException
{
    timestamp = SDF.parse(ddMMyyyy + " " + HHmmss).getTime();
    return timestamp;
}

这是简介 http://postimg.org/image/72iua8x9j/ 3> 用SimpleTimeFormat java类。 如果正在创建新对象,则完成此任务需要 51.6%。

public long getTimei( String ddMMyyyy, String HHmmss) throws ParseException
{
    timestamp  = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss", Locale.ENGLISH).parse(ddMMyyyy + " " + HHmmss);
    return timestamp.getTime();
}

这是简介 postimg.org/image/rnp2m1c2r/

现在我的问题还是一样???

1> 有没有更好的库,又不是那么贵?

2> 如果没有标准库,有人可以指点我转换逻辑吗?我试过谷歌搜索但没有成功。这个网站上的公式很少,但它们不起作用,或者让我们称之为它们不够简单。

最佳答案

Is there any better library which is not so expensive ?

很有可能您不应该每次都创建一个新的 SimpleDateFormat 而您忘记了先预热代码。我建议您在忽略前 10,000 次运行后至少运行测试 2 秒。

或者您可能混淆了 (ns) 纳秒和 (ms) 毫秒。

public static final SimpleDateFormat SDF = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss", Locale.ENGLISH);
static {
    SDF.setTimeZone(TimeZone.getTimeZone("GMT"));
}

public static void main(String[] args) throws Exception {
    String dateTime = SDF.format(new Date());

    long start = 0;
    int warmup = 10000;
    int runs = 1000000;
    for (int i = -warmup; i < runs; i++) {
        if (i == 0)
            start = System.nanoTime();
        long time = SDF.parse(dateTime).getTime();
        if (time < 0) throw new AssertionError();
    }
    long time = System.nanoTime() - start;
    System.out.printf("The average time to parse the current time was %,d nano-seconds%n", time / runs);
}

打印

The average time to parse the current time was 1,250 nano-seconds

如果 1250 纳秒不够快,您可以编写自己的解析器。我见过的最快的是 100 纳秒。

关于java - 将时间戳转换为自纪元以来的毫秒数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18287130/

相关文章:

java - Windows 上的 Thrift/Google Protocol Buffers

java - 为 JBoss AS 7 运行 Java 服务包装器时出错

sql - PostgreSQL 更新时区偏移量

java - Hibernate 无法读取或写入 org.joda.time.LocalDate

java - 玩家对象向一个方向移动但转向不同的方向

java - 如果父类(super class)有文档,则忽略丢失的文档

python - 如何将整数时间戳转换为日期时间

elasticsearch - 在Kibana中按时间戳排序日志

java - 比较两个 joda DateTime 实例

jodatime - Joda Time : Get max number of weeks for particular year