我需要使用给定时区格式化字符串日期并返回日期对象。我目前在IST时区。
所以IST比UTC早5小时30分钟。
public void getDate(){
String dateStr = "11/25/2016T13:30:00.000";
String dateFormat = "MM/dd/yyyy'T'HH:mm:ss.SSS";
Date date = formatedStringToDate(dateStr, dateFormat);
System.out.println(date);
}
public static Date formatedStringToDate(final String date, final String dateFormat) throws ParseException {
final SimpleDateFormat sdf = new SimpleDateFormat(dateFormat);
sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
Date parsedDate = null;
if (date != null) {
try {
parsedDate = sdf.parse(date);
} catch (ParseException e) {
throw e;
}
}
return parsedDate;
}
我得到了以下内容。
Fri Nov 25 19:00:00 **IST** 2016
时间似乎从5.30小时开始变化,但如果是IST到UCT的时间转换,那应该是在13:30:00之前的5.30小时,也就是08:00:00?
另外,如何更改输出字符串中突出显示的IST部分以显示此情况下的当前时区UTC?
答案 0 :(得分:2)
当您在toString
上致电Date
时(通过打印),您将获得默认格式(因为Date
是存储数字的对象自一个纪元以来,Java 9+中的毫秒或纳秒。要在UTC中查看结果,您需要类似的内容,
final DateFormat sdf = DateFormat.getDateTimeInstance(DateFormat.FULL,
DateFormat.FULL);
sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
Date date = formatedStringToDate(dateStr, dateFormat);
System.out.println(sdf.format(date)); // <-- format the Date
答案 1 :(得分:0)
LocalDateTime.parse( "2017-11-25T13:30:00.000" )
.atZone( ZoneId.of( "Asia/Kolkata" ) )
2017-11-25T13:30 + 05:30 [亚/加尔各答]
现代方法使用 java.time 类替换了麻烦的旧遗留日期时间类。
在没有任何区域指示符或从UTC偏移的情况下,将输入字符串解析为LocalDateTime
。
首选使用标准ISO 8601格式的字符串。在解析/生成字符串时, java.time 类默认使用标准格式。
LocalDateTime ldt = LocalDateTime.parse( "2017-11-25T13:30:00.000" ) ;
ldt.toString():2017-11-25T13:30
如果您确定此日期时间旨在表示印度的挂钟时间,那么请指定一个时区来生成ZonedDateTime
对象。
以continent/region
的格式指定proper time zone name,例如America/Montreal
,Africa/Casablanca
或Pacific/Auckland
。切勿使用诸如EST
或IST
之类的3-4字母缩写,因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)。
ZoneId z = ZoneId.of( "Asia/Kolkata" ) ;
ZonedDateTime zdt = ldt.atZone( z ) ;
zdt.toString():2017-11-25T13:30 + 05:30 [亚洲/加尔各答]
您可以调整到另一个区域进行比较。
ZonedDateTime zdtMontreal = zdt.withZoneSameInstant( ZoneId.of( "America/Montreal") );
zdtMontreal.toString():2017-11-25T03:00-05:00 [美国/蒙特利尔]
要解析/生成其他格式的字符串,例如问题中的字符串,请使用DateTimeFormatter
或DateTimeFormatterBuilder
类。搜索Stack Overflow获取更多信息,因为这些已被广泛报道。
DateTimeFormatter f = DateTimeFormatter.ofPattern( "MM/dd/uuuu'T'HH:mm:ss.SSS" , Locale.US ) ;
使用该格式化程序进行解析。
LocalDateTime ldt = LocalDateTime.parse( "11/25/2016T13:30:00.000" , f ) ;
生成。
String output = ldt.format( f ) ; // Generate string.
请考虑使用ISO 8601格式。
java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,Calendar
和&amp; 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。