我有日期与它的时区,我想把它转换为另一个时区,例如,我有日期'3/15/2013 3:01:53 PM',这是在时区'GMT-06:00'。我想将其转换为'GMT-05:00'时区。我有很多搜索,我对实际日期是如何工作的感到困惑。如何将时区应用于日期。我已经尝试了SimpleDateFormat, calendar和offset。
DateFormat df = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss aaa XXX");
df.setTimeZone(TimeZone.getTimeZone("GMT"));
Date dt = null;
try {
dt = df.parse("3/15/2013 3:01:53 PM -06:00");
} catch (ParseException e) {
e.printStackTrace();
}
String newDateString = df.format(dt);
System.out.println(newDateString);
返回输出03/15/2013 09:01:53 AM Z
。我想应该是03/15/2013 09:01:53 PM Z
,因为时间在'GMT-06:00'时区,所以它应该是HH+6来获得GMT时间。我想要日期在"yyyy-MM-dd HH:mm:ss"格式,其中HH是在24小时。请给我举个例子。提前感谢。
我正在使用SimpleDateFormat将字符串转换为日期
DateFormat df = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss aaa");
Date dt = null;
try {
dt = df.parse("3/15/2013 3:01:53 PM");
} catch (ParseException e) {
e.printStackTrace();
}
现在,正如你所说,我指定我的日期在'GMT-06:00'时区,并设置我的日期,
Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("GMT-6"));
cal.setTime(dt);
现在,我告诉日历我想要日期在'GMT'
cal.setTimeZone (TimeZone.getTimeZone("GMT"));
System.out.println (cal.getTime ());
输出:Fri Mar 15 03:01:53 CDT 2013
如果我做错了,请告诉我。
您需要两个格式对象,一个用于解析,另一个用于打印,因为您使用两个不同的时区,参见这里:
// h instead of H because of AM/PM-format
DateFormat parseFormat = new SimpleDateFormat("M/dd/yyyy hh:mm:ss aaa XXX");
Date dt = null;
try {
dt = parseFormat.parse("3/15/2013 3:01:53 PM -06:00");
}catch (ParseException e) {
e.printStackTrace();
}
DateFormat printFormat = new SimpleDateFormat("M/dd/yyyy hh:mm:ss aaa XXX");
printFormat.setTimeZone(TimeZone.getTimeZone("GMT-05"));
String newDateString = printFormat.format(dt);
System.out.println(newDateString);
输出:3/15/2013 04:01:53 PM -05:00
如果您想要HH:mm:ss(24小时格式),那么您只需替换
hh:mm:ss aaa
HH:mm:ss
在printFormat-pattern 。
评论问题的其他方面:
A java.util.Date
没有内部时区,总是通过spec引用UTC。在该对象中不能更改它。可以对格式化的字符串进行时区转换,但是正如我的代码示例所演示的那样(您希望转换为时区GMT-05)。
问题然后切换到使用UTC时区(符号Z)以iso格式打印Date
-对象的新要求。这可以通过将模式替换为"yyyy-MM-dd 'HH:mm:ssXXX"并显式地将printFormat的时区设置为GMT+00来完成格式化。您应该明确您真正想要的格式化输出。
关于java.util.GregorianCalendar
:在这里设置时区是以编程的方式更改日历对象,因此它会影响calendar.get(Calendar.HOUR_OF_DAY)
等方法调用。然而,这与格式没有任何关系!
br
OffsetDateTime.parse(
"3/15/2013 3:01:53 PM -06:00" ,
DateTimeFormatter.ofPattern( "M/d/yyyy H:mm:ss a XXX" )
).withOffsetSameInstant(
ZoneOffset.of( -5 , 0 )
)
<标题> java.time h1> Hochschild的答案是正确的,但使用了过时的类。与早期Java版本捆绑在一起的麻烦的旧日期时间类已经被现代的 Java所取代。时间类。2013 - 03 - 15 - t15:01:53 06:00时
将输入字符串解析为OffsetDateTime
,因为它包含utc的偏移量,但不包含时区。
String input = "3/15/2013 3:01:53 PM -06:00";
DateTimeFormatter f = DateTimeFormatter.ofPattern( "M/d/yyyy h:mm:ss a XXX" );
OffsetDateTime odt = OffsetDateTime.parse( input , f );
odt.toString (): 2013 - 03 - 15 - t15:01:53 06:00时
提示:在以文本形式交换日期-时间数据时,使用ISO 8601格式可以省去一些麻烦。java。Time类在解析/生成字符串时默认使用这些标准格式。
显然你想要看到和其他地方的人看到的相同的时刻,使用不同的utc偏移量。
ZoneOffset offset = ZoneOffset.of( -5 , 0 ) ;
OffsetDateTime odt2 = odt.withOffsetSameInstant( offset ) ;
我们看到偏移量从6变化到5,一天中的小时相应地从15变化到16。相同的同时时刻,不同的挂钟时间。
<标题> 生成字符串odt2.toString (): 2013 - 03 - 15 - t16:01:53凌晨
我想要日期为"yyyy-MM-dd HH:mm:ss"格式,其中HH为24小时。
我建议你总是包括一些偏移量或区域的指示,除非你绝对确定用户从更大的上下文中理解。
你的格式几乎是标准的ISO 8601格式。您可以定义自己的格式化模式,但我只会做字符串操作,将中间的T
替换为SPACE。
String output = odt2.format( DateTimeFormatter.ISO_LOCAL_DATE_TIME ).replace( "T" , " " ) ;
2013-03-15 16:01:53
<标题>对 java.time
java。time框架内置于Java 8及以后版本中。这些类取代了麻烦的旧的遗留日期时间类,如java.util.Date
, Calendar
, &SimpleDateFormat
.
Joda-Time项目,现在处于维护模式,建议迁移到java。时间类。
要了解更多信息,请参阅Oracle教程。并搜索Stack Overflow以获得许多示例和解释。规格为JSR 310。
使用符合JDBC 4.2或更高版本的JDBC驱动程序,您可以交换java。Time 直接与数据库关联。不需要字符串或java.sql。*类。
从哪里获取java。时间类?
- Java SE 8, Java SE 9,以及更高版本
- 内置。
- 标准Java API的一部分,捆绑实现。
Java 9增加了一些小的特性和修复。
- 大部分java。时间功能向后移植到Java 6;7在 ThreeTen-Backport 。
- Android版本的java bundle实现。时间类。
- 对于早期的Android, ThreeTenABP项目适应ThreeTen-Backport(如上所述)。参见如何使用ThreeTenABP…。
Interval
、YearWeek
、YearQuarter
等。
标题>标题>标题>