How to set time zone of a java.util.Date?
我已经从一个
我该怎么做?
使用dateformat。例如,
1 2 3 | SimpleDateFormat isoFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); isoFormat.setTimeZone(TimeZone.getTimeZone("UTC")); Date date = isoFormat.parse("2010-05-23T09:01:02"); |
在意识到
编码器为ZZ的节目,你在
DR
…parsed … from a String … time zone is not specified … I want to set a specific time zone
Ok.
1 2 | LocalDateTime.parse("2018-01-23T01:23:45.123456789" ) // Parse string, lacking an offset-from-UTC and lacking a time zone, as a `LocalDateTime`. .atZone( ZoneId.of("Africa/Tunis" ) ) // Assign the time zone for which you are certain this date-time was intended. Instantiates a `ZonedDateTime` object. |
J.U.日期无时区
如其他正确答案所述,java.util.date没有时区?。表示UTC/GMT(无时区偏移)。非常令人困惑,因为它的
出于这一点和许多其他原因,您应该避免使用内置的java.util.date&;calendar&java.text.simpledateformat。他们是出了名的麻烦事。好的。
取而代之的是使用Java 8捆绑的JavaTimePayes。好的。Java.时间
java.time类可以用三种方式表示时间线上的某个时刻:好的。
- UTC(
Instant ) - 带偏移(
OffsetDateTime 和ZoneOffset ) - 带时区(
ZonedDateTime 带ZoneId )
在java.time中,基本的构建块是
1 | Instant instant = Instant.now(); |
应用从UTC的偏移量以调整到某个位置的墙上时钟时间。好的。
应用
1 2 | ZoneOffset zoneOffset = ZoneOffset.of("-04:00" ); OffsetDateTime odt = OffsetDateTime.ofInstant( instant , zoneOffset ); |
更好的方法是应用时区、偏移量以及处理异常(如夏令时(DST))的规则。好的。
将
1 2 | ZoneId zoneId = ZoneId.of("America/Montreal" ); ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId ); |
如果输入字符串缺少偏移量或区域的任何指示器,则解析为
如果您确定要使用的时区,请指定一个
对这三个类中的任何一个调用
1 2 3 |
对于其他格式,使用
JavaTimeFr框架是在Java 8和之后构建的。这些类取代了麻烦的旧遗留日期时间类,如
现在处于维护模式的joda time项目建议迁移到java.time类。好的。
要了解更多信息,请参阅Oracle教程。以及搜索堆栈溢出以获得许多示例和解释。规格为JSR 310。好的。
您可以直接与数据库交换java.time对象。使用符合JDBC 4.2或更高版本的JDBC驱动程序。不需要字符串,不需要
在哪里获取java.time类?好的。
- JavaSE 8、Java SE 9、Java SE 10、Java SE 11,以及后来的标准JAVA API的一部分,实现了捆绑式实现。
- Java 9添加了一些小的特性和修复。
- Java SE 6和Java SE 7
- 大多数JavaTimeActudio的功能都被移植到TealEnter后端的Java 6和7中。
- 安卓
- java.time类的Android包实现的更高版本。
- 对于早期的Android(<26),threetenabp项目适应threeten backport(如上所述)。看看如何使用三连珠……
threeten额外项目使用额外的类扩展java.time。这个项目是将来可能添加到java.time的一个试验场。您可以在这里找到一些有用的类,如
虽然Joda Time仍在积极维护,但它的制造商告诉我们,只要方便,就可以迁移到java.time。我保留这一部分作为参考,但我建议使用上面的
在Joda Time中,日期时间对象(
1 2 3 4 | String input ="2014-01-02T03:04:05"; DateTimeZone timeZone = DateTimeZone.forID("Asia/Kolkata" ); DateTime dateTimeIndia = new DateTime( input, timeZone ); DateTime dateTimeUtcGmt = dateTimeIndia.withZone( DateTimeZone.UTC ); |
调用
1 |
Joda Time还提供了生成各种其他字符串格式的丰富功能。好的。
如果需要,可以将joda time datetime转换为java.util.date。好的。
1 |
在stackoverflow中搜索"joda date",以找到更多的示例,其中一些非常详细。好的。
?实际上,java.util.date中嵌入了一个时区,用于某些内部函数(请参见有关此答案的注释)。但此内部时区不作为属性公开,因此无法设置。此内部时区不是
所以你可以在JVM级别设置时区
1 2 3 4 5 6 7 8 |
输出:
1 2 | Thu Sep 05 10:11:12 EDT 2013 Thu Sep 05 14:11:12 UTC 2013 |
如果你必须与标准JDK类库,你可以只使用本:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | /** * Converts the given <wyn>date</wyn> from the <wyn>fromTimeZone</wyn> to the * <wyn>toTimeZone</wyn>. Since java.util.Date has does not really store time zome * information, this actually converts the date to the date that it would be in the * other time zone. * @param date * @param fromTimeZone * @param toTimeZone * @return */ public static Date convertTimeZone(Date date, TimeZone fromTimeZone, TimeZone toTimeZone) { long fromTimeZoneOffset = getTimeZoneUTCAndDSTOffset(date, fromTimeZone); long toTimeZoneOffset = getTimeZoneUTCAndDSTOffset(date, toTimeZone); return new Date(date.getTime() + (toTimeZoneOffset - fromTimeZoneOffset)); } /** * Calculates the offset of the <wyn>timeZone</wyn> from UTC, factoring in any * additional offset due to the time zone being in daylight savings time as of * the given <wyn>date</wyn>. * @param date * @param timeZone * @return */ private static long getTimeZoneUTCAndDSTOffset(Date date, TimeZone timeZone) { long timeZoneDSTOffset = 0; if(timeZone.inDaylightTime(date)) { timeZoneDSTOffset = timeZone.getDSTSavings(); } return timeZone.getRawOffset() + timeZoneDSTOffset; } |
学分去本邮件。
本代码是在程序中给我的工作:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | Instant date = null; Date sdf = null; String formatTemplate ="EEE MMM dd yyyy HH:mm:ss"; try { SimpleDateFormat isoFormat = new SimpleDateFormat("EEE MMM dd yyyy HH:mm:ss"); isoFormat.setTimeZone(TimeZone.getTimeZone(ZoneId.of("US/Pacific"))); sdf = isoFormat.parse(timeAtWhichToMakeAvailable); date = sdf.toInstant(); } catch (Exception e) { System.out.println("did not parse:" + timeAtWhichToMakeAvailable); } LOGGER.info("timeAtWhichToMakeAvailable:" + timeAtWhichToMakeAvailable); LOGGER.info("sdf:" + sdf); LOGGER.info("parsed to:" + date); |
转换日期字符串simpledateformat做它。
1 2 3 4 5 | SimpleDateFormat readFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); readFormat.setTimeZone(TimeZone.getTimeZone("GMT" + timezoneOffset)); String dateStr = readFormat.format(date); SimpleDateFormat writeFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); Date date = writeFormat.parse(dateStr); |
如果任何人都需要这个,如果你需要可以
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | XMLGregorianCalendar xmlStartTime = DatatypeFactory.newInstance() .newXMLGregorianCalendar( ((GregorianCalendar)GregorianCalendar.getInstance()); xmlStartTime.setTimezone(0); GregorianCalendar startCalendar = xmlStartTime.toGregorianCalendar(); Date startDate = startCalendar.getTime(); XMLGregorianCalendar xmlStartTime = DatatypeFactory.newInstance() .newXMLGregorianCalendar(startCalendar); xmlStartTime.setHour(startDate.getHours()); xmlStartTime.setDay(startDate.getDate()); xmlStartTime.setMinute(startDate.getMinutes()); xmlStartTime.setMonth(startDate.getMonth()+1); xmlStartTime.setTimezone(-startDate.getTimezoneOffset()); xmlStartTime.setSecond(startDate.getSeconds()); xmlStartTime.setYear(startDate.getYear() + 1900); System.out.println(xmlStartTime.toString()); |
结果:
1 2 | 2015-08-26T12:02:27.183Z 2015-08-26T14:02:27.183+02:00 |