使用时区java将字符串转换为适当的日期
我有日期与它的时区,我想将其转换为另一个时区,例如我有日期'3/15/2013 3:01:53 PM'这是在TimeZone'GMT-06:00'。 我想在'GMT-05:00'时区转换。 我有很多搜索,而且我对日期实际工作方式感到困惑。 如何应用时区到日期。 我尝试使用SimpleDateFormat,日历和偏移量。
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();
}
现在,正如您所说,我已向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());
输出:
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模式中。
问题的其他方面的评论:
一个java.util.Date
没有内部时区,并且通过spec来引用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)
类的方法调用。 但这与格式无关!
TL;博士
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
java.time
答案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格式。 你可以定义你自己的格式化模式,但是我只需要进行字符串处理,用SPACE替换中间的T
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.time类。
要了解更多信息,请参阅Oracle教程。 并搜索堆栈溢出了很多例子和解释。 规范是JSR 310。
使用符合JDBC 4.2或更高版本的JDBC驱动程序,您可以直接与数据库交换java.time对象。 不需要字符串或java.sql。*类。
何处获取java.time类?
ThreeTen-Extra项目将java.time扩展到其他类。 这个项目是未来可能增加java.time的一个试验场。 您可以在这里找到一些有用的课程,例如Interval
, YearWeek
, YearQuarter
等。