当前位置: 首页 > 知识库问答 >
问题:

从新纪元开始将时间戳转换为毫秒

子车英达
2023-03-14

目前我正在逐行读取数据文件。每行都有一个时间戳,格式为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.

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

在分析之后,我发现方法一的成本非常高,而方法二的成本比第一种低一些,但仍然很高。第一个需要大约1600ms的CPU时间,第二个需要1100ms的CPU时间。

问题-

1个

2.

谢谢

**

**

好啊在这里添加更多细节。测试运行了1000万条记录。每一行都有时间戳,需要将时间戳转换为毫秒。

下面是我试过的三个版本的代码。

1个

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.

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.

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();
}

这是我的个人资料。org/image/rnp2m1c2r/

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

1个

2.

共有2个答案

程谦
2023-03-14

处理这种时间转换的现代方法是使用java.time框架。我不知道它在执行速度或垃圾生成方面的表现如何,但应该考虑它。

爪哇。时间框架内置于Java8及更高版本中。这些类取代了旧的麻烦的日期时间类,比如java。util。日期。日历

要了解更多信息,请参阅Oracle教程。并在Stack Overflow中搜索许多示例和解释。

许多java.time功能被反向移植到Java6

你的问题没有解决时区问题。因此,我将假设您的输入字符串是针对UTC的,并使用Instantclass。对于其他时区,请在堆栈溢出中搜索ZoneDateTime

Instant类表示UTC时间线上分辨率高达纳秒的时刻。其toEpochMilli方法生成一个long整数(64位),计算自1970年UTC中的第一个时刻以来的毫秒数。请注意,此方法可能会丢失数据,因为当截断为毫秒时,任何纳秒都会被删除。

DateTimeFormatter formatter = DateTimeFormatter.ofPattern( "dd/MM/uuuu HH:mm:ss" );
Instant instant = Instant.parse( yourInputStringGoesHere , formatter );
long millisecondsSinceEpochOf1970 = instant.toEpochMilli();
斜浩穰
2023-03-14

有没有更好的图书馆不那么贵?

更可能的情况是,您不应该每次都创建一个新的SimpleDataFormat,而忘记了先预热代码。我建议您在忽略前10000次运行后,至少运行测试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纳秒。

 类似资料:
  • 我正在训练把人类可读时间转换成纪元时间。这是我的测试用例 上面的代码打印4次“无效输入”,然后第5行打印正确的历元值,因为我的text='12.12.2020'输入字符串符合第5个条件。我需要打印,如果我的“文本”条件符合任何这些格式,然后只打印纪元值,否则打印“无效输入”。有谁能帮我解决这个问题吗?提前道谢。

  • 我有一个Unix历元时间戳(以毫秒为单位),需要获取本地时间的日期字符串。 这是我的代码: 由上述函数生成的原始时间戳和结果日期、小时和所有其他值均以UTC为单位。如何更改代码以在当地时间获取它?

  • 我想把UTC的时间戳转换成Postgres中的毫秒。我在Ruby控制台上使用这个查询(使用Postgres)。我的问题是: 以上查询结果, 2018年7月5日星期四05:05:39 UTC 00:00至1530767139732.35 输出看起来不错,但在“.”之后我不需要35岁。有没有办法得到13位毫秒的输出。 我会很感激你的帮助。

  • 问题内容: 我一直在寻找一种将字符串(以纪元时间)转换为日期的方法。 基本上,我需要使用this:(以字符串形式)并将其放入this:中。 我一直在看strptime和strftime,但似乎都没有为我工作。有什么建议么? 编辑:谢谢,伙计们。我将其转换为int ,将其转换为,然后在其上运行。完美地工作! 问题答案: 如果只有该值是整数而不是字符串,则可以调用。如果只有某种方法可以将字符串转换为整

  • 问题内容: 如何将格式的人类可读时间转换为Unix时间戳(以 毫秒为单位) ?我发现了很多类似的问题,但是没有找到这个特定的问题/答案。 问题答案: 在Python 3中,这可以分两个步骤完成: 将时间字符串转换为对象 将对象的时间戳乘以1000,以将其转换为毫秒。 例如这样: 输出: 接受您的时间字符串和格式字符串作为输入。该TIMESTRING(第一个参数)指定 什么 你真的想转换为对象。格式