2012-08-22 185 views
7

我对当前UTC时间以毫秒为单位不感兴趣,也不需要混淆时区。我的原始日期已存储为UTC时间戳。将UTC日期转换为毫秒

我有一个日期存储在数据库中的UTC时间,“2012-06-14 05:01:25”。 我对日期时间不感兴趣,但只是它的日期部分。因此,在Java中检索日期之后,排除小时,分钟和秒 - 我剩下“2012-06-14”。

如何将其转换为UTC毫秒?

回答

0

将Date对象与SimpleDateFormat结合使用。

Date中有一个名为getTime()的方法,它将为您返回毫秒。

的例子,解决您的问题:

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

编辑:我已经错过了“忽略了一天的时间”的一部分。它现在存在,但接近尾声...

最简单的方法可能是使用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(); 

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

或者,如果你做任何事情比这更少的琐碎,使用Joda Time这是一个更好的日期/时间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个字符都还好。

+0

由于OP只想要日期,我会子串(0,10),其第一和解析只是日期。 –

+0

@PeterLawrey:我实际上错过了那部分!将编辑... –

+2

@PeterLawrey:我在帖子结尾处针对子字符串调用进行了争论。 –

0
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. 印刷它直客。
0
简单

answer by Jon Skeet是正确的。他在解析时包含而不是截断时间信息是一个很好的观点。

但是,他的代码可以简化。特别是因为Joda-Time在最新版本中获得了一个重要的新方法:withTimeAtStartOfDay。此方法取代了现在已弃用的所有“午夜”相关类和方法。

指定Locale是个好习惯,正如他的代码所示。但在这种特殊情况下,Locale并不是必需的。

他的回答正确地表明了Joda-Time库,远远优于使用java.util.Date,.Calendar和java.text.SimpleTextFormat。这些班级出了名的麻烦,应该避免。而是使用Joda-Time或内置于Java 8中的新的java.time package(受JSR 310定义的Joda-Time的启发)。

第一刻的日

,如果你想要的是毫秒,since- epoch的计数你不能忽视时间的一天。我怀疑你想要的是把时间改变到一天的第一时刻。在UTC中,这通常意味着时间00:00:00.000。但请注意,在当地时区,由于Daylight Saving Time以及其他可能的异常情况,第一时间可能会是不同的时间。

ISO 8601

你的字符串是几乎在标准ISO 8601格式,但我们需要换一个T在中间的空间。然后,我们可以将结果字符串直接提供给Joda-Time,因为Joda-Time内置了标准字符串默认使用的formatters

示例代码

下面的示例代码假定你的问题的目的是分析一个字符串作为日期时间值在UTC时区,调整时间为一天的第一刻,然后转换自Unix epoch(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'. 
-1

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

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

有人没有给出理由就低估了我的答案。最近StackOverflow已经成为一种增长趋势,应该不鼓励。 – zeeshan