【问题标题】:Java 8 DateTimeFormatterJava 8 日期时间格式化程序
【发布时间】:2017-02-11 12:31:41
【问题描述】:

我需要用 Java 8 DateTimeFormatter 替换 SimpleDataFormat。下面是 SimpleDateFormat 的代码。

DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        Date date = sdf.parse(source);

现在我需要将其更改为 DateTimeFormatter。我尝试如下

LocalDateTime ld = LocalDateTime.now();
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd");
Date startdate = dtf.parse(dtf);

现在这正在生成异常。

【问题讨论】:

  • 另外,您的模式不在引号中
  • dtf.parse(dtf) 不会抛出异常 - 它不会编译。
  • ld 和它有什么关系?您是否阅读过DateTimeFormatter 的文档?它有一个例子......
  • 那么是什么让您认为您需要使用DateTimeFormatter?我敦促您完全避免使用java.util.Date
  • 我认为您想使用LocalDate 而不是LocalDateTime

标签: java java-8 datetimeformatter


【解决方案1】:
   DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd");
   LocalDate localDate = LocalDate.parse("2017-02-11", dtf);
   System.out.println(localDate.toString());

如果你想要来自 LocalDate 的 Date 对象,以下工作

Date date = Date.from(localDate.atStartOfDay(ZoneId.systemDefault()).toInstant());

正如@JonSkeet 建议的那样,如果您使用的是 Java 8,您可能应该完全避免使用 java.util.Date

【讨论】:

    【解决方案2】:

    如果在 DateTimeFormatter 中寻找等效的 sdf,请尝试 DateTimeFormatter.ISO_LOCAL_DATE
    探索 DateTimeFormatter 类以获取更多格式。

     LocalDateTime time = LocalDateTime.now();
        time.format(DateTimeFormatter.ISO_LOCAL_DATE);
    

    如果仅对日期感兴趣,请使用 LocalDate 而不是 LocalDateTime

    【讨论】:

      【解决方案3】:

      tl;博士

      java.util.Date.from(
      
      LocalDate.parse( "2017-01-23" )
               .atStartOfDay( ZoneId.of( "America/Montreal" ) )
               .toInstant()
      
      )
      

      不需要格式化模式

      不需要格式化模式。您的输入字符串恰好是标准 ISO 8601 格式。这些标准格式默认在 java.time 类中用于解析和生成字符串。

      LocalDate

      使用LocalDate 作为仅日期值,没有时间和时区。

      LocalDate ld = LocalDate.parse( "2017-01-23" );
      

      ZonedDateTime

      如果你想要一个日期时间,让 java.time 确定一天中的第一个时刻。不要假设第一个时刻是00:00:00

      确定一天中的第一时刻需要一个时区。日期因地区而异。

      ZoneId z = ZoneId.of( "America/Montreal" );
      ZonedDateTime zdt = ld.atStartOfDay( z );
      

      如果您想通过 UTC 的镜头感知那一刻,请提取一个 Instant 对象。

      Instant instant = zdt.toInstant();
      

      Instant 等同于旧的遗留类java.util.Date。两者都代表 UTC 时间线上的一个时刻。现代类具有更精细的分辨率,纳秒而不是毫秒。

      避免java.util.Date

      正如其他人所提到的,您应该坚持使用现代 java.time 类。但是,如果必须,您可以转换。查看添加到旧类的新方法。

      java.util.Date d = java.util.Date.from( instant ) ; 
      

      【讨论】:

        【解决方案4】:

        一种方法是-

            LocalDateTime ld = LocalDateTime.now();
            DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd");
            String date = ld.format(dtf);
        

        【讨论】:

        猜你喜欢
        • 2015-06-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-17
        相关资源
        最近更新 更多