试图在java中获得通用时间似乎非常困难。在C#
中有类似的东西DateTime.Now.ToUniversalTime()
似乎有点困难。我有一些代码从较早的日期中减去当前的utc时间,该日期也是为了找到时间上的差异。但我似乎无法看到如何获得当前的时间。这是我目前的代码
Date date = new Date();
long difference = date.getTime() - s.getTime();
s 已经在utc时间了,因为它来自一个传递给我时间的来源
答案 0 :(得分:1)
尝试一下:
Date utcDate = Calendar.getInstance(TimeZone.getTimeZone("UTC")).getTime();
最佳, Loddi
答案 1 :(得分:1)
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中日期时间处理的现代方法是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
。
您可以获得此持续时间内的总毫秒数。但要注意可能的数据丢失。 Instant
和Duration
类的分辨率为nanoseconds,比milliseconds更精细。因此,提取毫秒将截断超过毫秒的任何一秒。换句话说,您最多只能使用三位数的十进制表示,而不是最多只有三位数。
long millis = duration.toMillis(); // Possible data-loss in truncating nanoseconds to milliseconds.
java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,Calendar
和& SimpleDateFormat
现在位于Joda-Time的maintenance mode项目建议迁移到java.time。
要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310。
从哪里获取java.time类?
ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如Interval
,YearWeek
,YearQuarter
和more。
更新:现在位于Joda-Time的maintenance 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);