【问题标题】:Not able to convert string dd/MM/yyyy to Date dd/MM/yyyy in java无法在 java 中将字符串 dd/MM/yyyy 转换为日期 dd/MM/yyyy
【发布时间】:2016-09-22 12:54:02
【问题描述】:

我有一个格式为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

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

【问题讨论】:

  • 我认为你把事情复杂化了。查看this answer
  • 您最好从您的角度描述问题所在。因为formatter.parse("22/09/2016") 已经做了你想要的I was expecting 22/09/2016 as a date object
  • @Takarii 我没有使用 joda 库

标签: java date-format simpledateformat


【解决方案1】:

您似乎假设java.util.Date“知道”一种格式。它没有。这不是它的状态的一部分——它只是自 Unix 纪元以来的毫秒数。 (也没有时区 - 您看到的 IST 是您当地的时区;这只是 Date.toString() 所做的一部分。)

基本上,Date 只是一个瞬间 - 当您需要特定格式的值时,那就是使用 SimpleDateFormat

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

把它想象成一个数字——无论你用二进制表示为 10000、十进制表示为 16 还是十六进制表示为 0x10,十六进制都是同一个数字。 int 值没有任何“我是二进制整数”或“我是十六进制整数”的概念 - 只有当您将其转换为字符串时,您才需要关心格式化。日期/时间类型也是如此。

【讨论】:

    【解决方案2】:

    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.Calendarjava.text.SimpleDateFormat

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

    要了解更多信息,请参阅Oracle Tutorial。并在 Stack Overflow 上搜索许多示例和解释。

    大部分 java.time 功能在ThreeTen-Backport 中向后移植到Java 6 和7,并进一步适应ThreeTenABP 中的Android(请参阅How to use…)。

    ThreeTen-Extra 项目通过附加类扩展了 java.time。该项目是未来可能添加到 java.time 的试验场。您可以在这里找到一些有用的类,例如IntervalYearWeekYearQuartermore

    【讨论】:

      【解决方案3】:
       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);
              }
      

      【讨论】:

      • 它仍在返回一个字符串,不是吗?我需要一个日期对象。
      • @robot_alien 是的,您可以使用“d”对象。它的日期类型
      【解决方案4】:

      一个Date,在打印时会调用对象的toString方法。然后它将选择它想要的任何格式。

      试试

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

      或者——显然

      System.out.println(date);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-05-19
        • 1970-01-01
        • 2023-03-26
        • 1970-01-01
        • 1970-01-01
        • 2016-06-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多