无法解析日期异常

时间:2018-03-27 13:00:52

标签: java date date-format

我在字符串类型20/03/2018, 18:20:44上有日期和时间是否可以在java中将其更改为日期格式?我试过这段代码:

public static Date getDate(String dateString) {
    DateFormat formatter = new SimpleDateFormat("dd/mm/yyyy hh:mm:ss");
    formatter.setTimeZone(TimeZone.getTimeZone("PST"));
    try {
        Date date = formatter.parse(dateString);
        return date;
    } catch (ParseException e) {
        logger.error("error while parsing milliseconds to date" + dateString, e);
    }
    return null;
}

我无法解析异常并返回null

4 个答案:

答案 0 :(得分:7)

您在简单日期格式中使用了错误的字符串替换,它应该是dd/MM/yyyy, HH:mm:ss。请注意HH的大小写,您的时间是24小时格式,因此它必须HH超过hh

因此,应用更改后,您的代码将如下所示:

public static Date getDate(String dateString) {
  DateFormat formatter = new SimpleDateFormat("dd/MM/yyyy, HH:mm:ss");
  formatter.setTimeZone(TimeZone.getTimeZone("PST"));
  try {
    return formatter.parse(dateString);
  } catch (ParseException e) {
    logger.error("error while parsing milliseconds to date" + dateString, e);
  }
  return null;
}

详细了解可用的各种模式here,除了通常建议使用ISO 8601格式的日期,因此您的yyyy-MM-ddTHH:mm:ss

答案 1 :(得分:3)

您应该使用与输入字符串相同的格式:

DateFormat formatter = new SimpleDateFormat("dd/MM/yyyy, hh:mm:ss");

答案 2 :(得分:2)

你犯了两个错误:

  • mm代表分钟。 MM表示月份 但是您在日期格式的月份部分指定了mm
  • 输入中提供的昏迷字符:,也必须以日期格式显示。

所以使用这种形式的String输入:"20/03/2018, 18:20:44",你应该使用这个DateFormat:

DateFormat formatter = new SimpleDateFormat("dd/MM/yyyy, hh:mm:ss");

答案 3 :(得分:1)

TL;博士

您的格式设置模式不正确,使用了错误的大小写并省略了逗号。

此外,您正在使用 java.time 类多年前取代的麻烦类。

LocalDateTime.parse(                                       // Create a `LocalDateTime` object as the input string lacks any time zone or offset-from-UTC.
    "20/03/2018, 18:20:44" , 
    DateTimeFormatter.ofPattern( "dd/MM/uuuu, HH:mm:ss" )  // Define a formatting pattern to match the input.
)
.atZone(                                                   // Assign a time zone to the `LocalDateTime` to create a `ZonedDateTime` object.
    ZoneId.of( "America/Los_Angeles" )                     // Specify time zone to be assigned. Always use proper zone names `continent/region`; never use 3-4 character pseudo-zones.
)
  

2018-03-20T18:20:44-07:00 [美国/洛杉矶]

java.time

你正在使用现在遗留下来的麻烦的旧日期时间类,取而代之的是 java.time 类。

将字符串解析为LocalDateTime,因为它没有time zoneoffset-from-UTC的指示符。

String input = "20/03/2018, 18:20:44" ;
DateTimeFormatter f = DateTimeFormatter.ofPattern( "dd/MM/uuuu, HH:mm:ss" ) ;
LocalDateTime ldt = LocalDateTime.parse( input , f ) ;
  

ldt.toString():2018-03-20T18:20:44

缺少时区或偏离UTC意味着代表片刻,时间轴上的某个点。如果没有区域/偏移的背景,这只是对26-27小时范围内潜在时刻的模糊概念。

显然你确定这个输入实际上是指在某个时区。将ZoneId应用于此LocalDateTime以获取ZonedDateTime对象。

continent/region的格式指定proper time zone name,例如America/MontrealAfrica/CasablancaPacific/Auckland。切勿使用诸如ESTIST之类的3-4字母缩写,因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)。

ZoneId z = ZoneId.of( "America/Los_Angeles" ) ; 
ZonedDateTime zdt = ldt.atZone( z ) ;

转换

最好避免麻烦的遗留类。但是,如果您必须生成java.util.Date以与尚未针对 java.time 更新的旧代码进行交互操作,则可以进行转换。要来回转换,请在旧类上调用新方法。

java.util.Date表示UTC时间轴上的一个点,分辨率为毫秒。因此,它在 java.time 中的替换是InstantInstant也是UTC时间轴上的一个点,具有更精细的纳秒级分辨率。要访问Date,我们需要Instant,我们可以从ZonedDateTime中提取。{/ p>

Instant instant = zdt.toInstant() ;  // Same moment, same point on the timeline, different wall-clock time.

现在,我们可以通过调用Date.from来获取旧版类对象Date

java.util.Date date = Date.from( instant ) ;  // Do this only if you *must* work with `Date` class.

关于 java.time

java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendar和& SimpleDateFormat

现在位于Joda-Timemaintenance mode项目建议迁移到java.time类。

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310

您可以直接与数据库交换 java.time 对象。使用符合JDBC driver或更高版本的JDBC 4.2。不需要字符串,不需要java.sql.*类。

从哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuartermore