使用时区格式化日期字符串并返回日期对象

时间:2016-11-25 08:22:10

标签: java simpledateformat java.util.date

我需要使用给定时区格式化字符串日期并返回日期对象。我目前在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?

2 个答案:

答案 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)

TL;博士

LocalDateTime.parse( "2017-11-25T13:30:00.000" )
    .atZone( ZoneId.of( "Asia/Kolkata" ) )
  

2017-11-25T13:30 + 05:30 [亚/加尔各答]

java.time

现代方法使用 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/MontrealAfrica/CasablancaPacific/Auckland。切勿使用诸如ESTIST之类的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 [美国/蒙特利尔]

要解析/生成其他格式的字符串,例如问题中的字符串,请使用DateTimeFormatterDateTimeFormatterBuilder类。搜索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.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendar和&amp; SimpleDateFormat

现在位于Joda-Timemaintenance 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的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuartermore