无法在java中将字符串dd / MM / yyyy转换为Date dd / MM / yyyy

时间:2016-09-22 12:54:02

标签: java date-format simpledateformat

我有一个格式为dd/MM/yyyy的输入字符串,我需要将其转换为日期dd/MM/yyyy

我的方法是:

SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");
String date = formatter.format(formatter.parse("22/09/2016"));
Date convertedDate = formatter.parse(date);

我期待22/09/2016作为日期对象,但返回的格式不符合预期。 O/P=>Mon Sep 12 00:00:00 IST 2016

知道我哪里错了吗?提前谢谢!

4 个答案:

答案 0 :(得分:6)

你好像假设java.util.Date"知道"格式。它没有。这不属于它的状态 - 它的只是自Unix时代以来的毫秒数。 (那里也没有时区 - 你在IST看到的是你当地的时区;这只是Date.toString()所做的一部分。)

基本上,Date只是一个瞬间 - 当你想要一个特定的格式化值时,当你使用SimpleDateFormat时。{/ p>

(或者更好的是,使用java.time.* ...)

将其视为一个数字 - 无论您将二进制数表示为10000,十进制表示为16,还是十六进制表示为0x10,数字16都是相同的数字。 int值没有任何概念"我是二进制整数"或者"我是一个十六进制整数" - 只有当您将其转换为需要关注格式化的字符串时才会这样做。对于日期/时间类型,情况完全相同。

答案 1 :(得分:3)

TL;博士

LocalDate.parse( "22/09/2016" , DateTimeFormatter.ofPattern( "dd/MM/yyyy" ) )
         .format( DateTimeFormatter.ofPattern( "dd/MM/yyyy" ) )

问题

  • 您正在将日期时间对象与表示日期时间值的字符串混淆。日期时间对象可以解析字符串,并且可以生成字符串,但是日期时间对象始终是独立的并且与字符串不同。 字符串有格式;日期时间对象
  • 您正在使用现在由java.time类取代的麻烦的旧日期时间类。
  • 您正在尝试将仅限日期的值放入日期时间对象(方形挂钩,圆孔)。
  • 您被设计糟糕的toString方法所欺骗,该方法将时区静默应用于没有时区(UTC)的内部值。

请务必阅读the correct Answer by Jon Skeet

java.time

使用新的java.time类,特别是LocalDateLocalDate类表示没有时间且没有时区的仅限日期的值。

DateTimeFormatter f = DateTimeFormatter.ofPattern( "dd/MM/yyyy" );
LocalDate ld = LocalDate.parse( "22/09/2016" , f );

通过调用toString生成一个字符串,以标准ISO 8601格式表示该值。

String output = ld.toString(); // 2016-09-22

通过应用格式化程序生成所需格式的字符串。

String output = ld.format( f );

关于java.time

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

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

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

大部分java.time功能都被反向移植到Java 6& ThreeTen-Backport中的7,并进一步适应Android中的ThreeTenABP(见How to use…)。

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

答案 2 :(得分:1)

 try {
            SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");
            Date d = formatter.parse("22/09/2016");
            System.out.println(d.toString());
            String e = formatter.format(d);
            System.out.println(e);
        } catch (ParseException ex) {
            Logger.getLogger(Json.class.getName()).log(Level.SEVERE, null, ex);
        }

答案 3 :(得分:0)

打印时defaultContainer.register(Stopwatch.self) { resolver in Stopwatch(signals: resolver.resolve(SignalsService.self)!) }.inObjectScope(.None) 会调用对象的Date方法。然后它会选择它想要的任何格式。

尝试

toString

或 - 显然

System.out.println(formatter.format(convertedDate));