Java utc毫秒

时间:2013-11-23 04:42:48

标签: java datetime utc

试图在java中获得通用时间似乎非常困难。在C#

中有类似的东西
DateTime.Now.ToUniversalTime()

似乎有点困难。我有一些代码从较早的日期中减去当前的utc时间,该日期也是为了找到时间上的差异。但我似乎无法看到如何获得当前的时间。这是我目前的代码

Date date = new Date();
long difference = date.getTime() - s.getTime(); 

s 已经在utc时间了,因为它来自一个传递给我时间的来源

5 个答案:

答案 0 :(得分:1)

尝试一下:

Date utcDate = Calendar.getInstance(TimeZone.getTimeZone("UTC")).getTime();

最佳, Loddi

答案 1 :(得分:1)

TL;博士

UTC当前时刻:

Instant.now()

经过的时间:

Instant then = … ;
Instant now = Instant.now();

Duration duration = Duration.between( then , now ); // For days-hours-minutes-seconds scale.

以毫秒计数。

long millis = duration.toMillis();  // Possible data-loss in truncating nanoseconds to milliseconds.

java.time

Java中日期时间处理的现代方法是java.time类。

Instant

Instant类代表UTC中时间轴上的一个时刻,分辨率为nanoseconds(小数部分最多九(9)位)。

Instant instant = Instant.now();  // Current moment in UTC.

Duration类表示未附加到时间轴的时间跨度。您可以输入一对Instant个对象来计算两者之间的天数,小时数,分钟数,秒数和纳秒数。

Duration duration = Duration.between( thisInstant , thatInstant );

致电toString以标准ISO 8601格式PnYnMnDTnHnMnS生成字符串,其中P标记开头,T分隔任何年 - 月 - 天小时 - 分钟 - 秒。例如,一个半小时是PT1H30M

您可以获得此持续时间内的总毫秒数。但要注意可能的数据丢失。 InstantDuration类的分辨率为nanoseconds,比milliseconds更精细。因此,提取毫秒将截断超过毫秒的任何一秒。换句话说,您最多只能使用三位数的十进制表示,而不是最多只有三位数。

long millis = duration.toMillis();  // Possible data-loss in truncating nanoseconds to milliseconds.

关于java.time

java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendar和& SimpleDateFormat

现在位于Joda-Timemaintenance mode项目建议迁移到java.time。

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310

从哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuartermore


约达时间

更新:现在位于Joda-Timemaintenance mode项目建议迁移到java.time。留下这部分完整的历史。

使用Joda-Time 2.4库。

DateTime nowUtc = DateTime.now( DateTimeZone.UTC );

最好避免使用java.util.Date和.Calendar,因为它们非常麻烦。但如果必须,你可以转换。

Date date = nowUtc.toDate();

至于获取日期时间值之间的差异,请搜索数百个答案的StackOverflow。 Joda-Time提供3个类来表示时间跨度:间隔,周期和持续时间。

答案 2 :(得分:0)

日期是UTC中的。没有时区附加到日期。

http://docs.oracle.com/javase/6/docs/api/java/util/Date.html#getTime()

  

返回自1970年1月1日00:00:00 GMT以来的毫秒数   由此Date对象表示。

是什么让你觉得它是在当地时间?

编辑:文档确实这么说,所以也许这就是问题所在:

  

虽然Date类旨在反映协调的通用   时间(UTC),它可能不会完全这样做,具体取决于主机   Java虚拟机的环境。

看起来这可能是一个很好的解决方案:

Calendar c = Calendar.getInstance();
int utcOffset = c.get(Calendar.ZONE_OFFSET) + c.get(Calendar.DST_OFFSET);  
Long utcMilliseconds = c.getTimeInMillis() + utcOffset;

答案 3 :(得分:0)

您可以使用以下方法查找UTC时间:

   Calender c= Calendar.getInstance(TimeZone.getTimeZone("UTC")); 

然后你可以从日历对象中获取月,日,时间,年份。 例如:c.get(Calender.YEAR)

希望这会对你有帮助..

答案 4 :(得分:0)

嗯,没有人提到System.currentTimeMillis()所以我会:)这将返回自Unix时代以来的毫秒数。这将始终是UTC(例如,如果您在伦敦和雅典同时调用它,您将获得相同的值 - 如果在这些设备上正确设置时间,则时区应该无关紧要)。如果您想从多个millis获取Calendar实例,您可以执行以下操作:

Calendar cal = GregorianCalendar.getInstance();
cal.setTimeInMillis(yourMillis);