将UTC日期转换成毫秒(Convert UTC date into milliseconds)

2019-06-27 06:54发布

我没有兴趣在当前UTC时间以毫秒为单位什么,我也不需要乱用的时区。 我原来的日期已经存储为UTC时间戳。

我有存储在UTC时间数据库中的日期“2012-06-14 5时01分25秒”。 我不感兴趣的日期时间,但就在它的日期部分。 因此,检索Java中的日期,并且不包括小时,分钟和秒后 - 我留下“2012-06-14”。

我怎么能转换为UTC毫秒呢?

Answer 1:

编辑:我错过了“忽略了一天的时间”的一部分。 它现在存在,但临近年底...

最简单的方法可能是使用SimpleDateFormat ,将其具有的时区适当:

SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.US);
format.setTimeZone(TimeZone.getTimeZone("UTC"));

Date date = format.parse(text);
long millis = date.getTime();

(设置时区是重要的一点在这里,因为否则会解释是在本地时区的值。)

另外,如果你做任何事情比这更少的小事,使用约达时间是一个更好的日期/时间API。 特别是, SimpleDateFormat 是不是线程安全的,而DateTimeFormatter是:

// This can be reused freely across threads after construction.
DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss")
    .withLocale(Locale.US)
    .withZoneUTC();

// Option 1
DateTime datetime = formatter.parseDateTime(text);
long millis = dateTime.getMillis();

// Option 2, more direct, but harder to diagnose errors
long millis = formatter.parseMillis(text);

现在为止,我们已经分析了整个整个堆。 忽略日期部分的最简单的方法就是舍它关闭 - 毕竟,Java不遵守闰秒,这样我们就可以截断它:

long millisPerDay = 24L * 60L * 60L * 1000L; // Or use TimeUnit
long dayMillis = (millis / millisPerDay) * millisPerDay;

将“圆朝1970年”所以,如果你 1970年之前有一个日期,将圆的一天结束 -但我怀疑这是不可能是一个问题。

随着约达时间的版本,你可以只用这个代替:

DateTime dateTime = formatter.parseDateTime(text);
long millis = dateTime.toLocalDate().getLocalMillis();

我个人只是服用子的想法走。 即使你不是在维护时/分/秒真正感兴趣的,我认为这是适当的解析你已经给什么, 然后扔掉信息。 除了别的,它使你的代码有错误的数据,如适当地失败

"2012-06-100"

要么

"2012-06-14 25:01:25"

表明无论真实提供您的数据的问题,这是很好的发现,与其盲目地继续,只是因为前10个字符都还好。



Answer 2:

更简单

在由乔恩飞碟双向的答案是正确的。 他使大约包括,而非截断,时间 - 日期的信息,同时解析好点。

然而,他的代码可以简化。 尤其是因为乔达时间获得最新版本的一个重要的新方法: withTimeAtStartOfDay 。 这种方法取代了所有的“午夜”相关的类和方法现在被废弃了。

指定区域设置是一个好习惯,如在他的代码。 但是,在这种特殊情况下,语言环境是没有必要的。

他的回答正确暗示乔达时库,远远优于使用java.util.Date,.Calendar和java.text.SimpleTextFormat。 这些类是出了名的麻烦,并且应该避免。 相反,请使用乔达时间或新java.time包内置到Java 8(由乔达时间,由JSR 310定义的启发)。

第一时刻的日子

如果你想要的是毫秒,since-的计数你不能忽视时间的天时代 。 我怀疑你想什么时候改变的一天的第一刻。 在UTC,这总是意味着时间00:00:00.000 。 但需要注意的是,在本地时区,第一时刻可能是不同的时间,因为夏令时和其他可能的异常。

ISO 8601

你的字符串是几乎在标准ISO 8601的格式,但我们需要换一个T在中间的空间。 然后我们就可以直接喂结果字符串乔达时间为乔达时间还内置格式化程序默认为标准字符串使用。

示例代码

下面的示例代码假定你的问题的目的是分析一个字符串作为一个日期时间值UTC时区,调整时间为一天的第一刻,然后转换成毫秒的数量自Unix纪元 (开头1970年UTC)。

String inputRaw = "2012-06-14 05:01:25";
String input = inputRaw.replace( " ", "T" );  // Replace SPACE with a 'T'.
DateTime dateTime = new DateTime( input, DateTimeZone.UTC );  // Parse, assuming UTC.
DateTime dateTimeTopOfTheDay = dateTime.withTimeAtStartOfDay();  // Adjust to first moment of the day.
long millisecondsSinceUnixEpoch = dateTimeTopOfTheDay.getMillis();  // Convert to millis. Use a 'long', not an 'int'.


Answer 3:

使用Date对象结合的SimpleDateFormat。

有()以日期命名的getTime方法,该方法将返回毫秒为您服务。

例子解决您的问题:

Date truc = new SimpleDateFormat( "y-m-d").parse( "2010-06-14");
System.out.println(truc.getTime());


Answer 4:

SimpleDateFormat ft = new SimpleDateFormat ("yyyy-MM-dd"); //or whatever format you have
Date t = ft.parse('2014-03-20');

String result = String.format("%tQ", t);

System.out.printf("%tQ", t);

这里有两种方法:

  1. 你把结果毫秒到一个变量的结果
  2. 在打印直客。


Answer 5:

我用一个简单和直接的方法:

Date date = new Date(utcDateInString);
long utcDateInMilliSeconds = date.getTime();


文章来源: Convert UTC date into milliseconds