我正在使用它的日期时区,我想将其转换为另一个时区,例如。我有Date' 3/15/2013 3:01:53 PM'这是在TimeZone' GMT-06:00'。我希望将其转换为GMT-05:00'时区。我有搜索很多,而且我对如何实际日期工作感到困惑。如何应用时区到目前为止。我尝试使用SimpleDateFormat,Calender以及偏移量。
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
,因为格林威治标准时间-06:00'时区,所以在GMT中得到时间应该是HH + 6。我希望日期在" 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();
}
现在,正如您所说,我已向Calender指定我的约会时间属于' 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());
OutPut:
Fri Mar 15 03:01:53 CDT 2013
如果我出错了,请告诉我。
答案 0 :(得分:9)
您需要两个格式对象,一个用于解析,另一个用于打印,因为您使用两个不同的时区,请参见此处:
// 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中的。
评论问题的其他方面:
java.util.Date
没有内部时区,并且始终按规格引用UTC。您无法在此对象内更改它。格式化字符串可以进行时区转换,但正如我的代码示例所示(您希望转换为区域GMT-05)。
然后问题切换到使用UTC时区(符号Z)以ISO格式打印Date
- 对象的新要求。这可以通过将模式替换为“yyyy-MM-dd'T'HH:mm:ssXXX”并将printFormat的时区显式设置为GMT + 00来完成格式化。你应该澄清你真正想要的格式化输出。
关于java.util.GregorianCalendar
:此处设置时区是以编程方式更改日历对象,因此会影响calendar.get(Calendar.HOUR_OF_DAY)
等方法调用。这与格式化无关!
答案 1 :(得分:0)
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 )
)
2013-03-15T15:01:53-06:00
Answer by Hochschild是正确的但使用了过时的类。与最早版本的Java捆绑在一起的麻烦的旧日期时间类已被现代 java.time 类取代。
将输入字符串解析为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-15T15: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-15T16:01:53-05:00
我希望日期为“yyyy-MM-dd HH:mm:ss”格式,其中HH在24小时内。
我建议您始终包含一些偏移或无区域的指示,您绝对可以确定用户从更大的上下文中理解。
您的格式几乎采用标准ISO 8601格式。你可以定义自己的格式化模式,但我只是用字符串操作来用空格替换中间的T
。
String output = odt2.format( DateTimeFormatter.ISO_LOCAL_DATE_TIME ).replace( "T" , " " ) ;
2013-03-15 16:01:53
java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,Calendar
和& SimpleDateFormat
现在位于Joda-Time的maintenance mode项目建议迁移到java.time类。
要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310。
如果JDBC driver符合JDBC 4.2或更高版本,您可以直接与数据库交换 java.time 对象。不需要字符串或java.sql。* classes。
从哪里获取java.time类?
ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如Interval
,YearWeek
,YearQuarter
和more。