目前我正在逐行读取数据文件。每行都有一个时间戳,格式为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.
处理这种时间转换的现代方法是使用java.time框架。我不知道它在执行速度或垃圾生成方面的表现如何,但应该考虑它。
爪哇。时间框架内置于Java8及更高版本中。这些类取代了旧的麻烦的日期时间类,比如java。util。日期
,。日历
,
要了解更多信息,请参阅Oracle教程。并在Stack Overflow中搜索许多示例和解释。
许多java.time功能被反向移植到Java6
你的问题没有解决时区问题。因此,我将假设您的输入字符串是针对UTC的,并使用Instant
class。对于其他时区,请在堆栈溢出中搜索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();
有没有更好的图书馆不那么贵?
更可能的情况是,您不应该每次都创建一个新的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(第一个参数)指定 什么 你真的想转换为对象。格式