【问题标题】:SimpleDateFormat sets current day for parsed dateSimpleDateFormat 为解析日期设置当前日期
【发布时间】:2016-12-23 13:45:33
【问题描述】:

有没有办法使用下面的simpleDateFormat:

final SimpleDateFormat simpleDateFormatHour = new SimpleDateFormat("HH:mm:ss z");

调用时:

simpleDateFormat.parse("12:32:21 JST");

返回 Date 对象的当前日期?

对于这些示例,它将返回:

Thu Jan 01 05:32:21 EET 1970

而不是:

<<today>> 05:32:21 EET <<currentYear>> 

我需要。

【问题讨论】:

  • SimpleDateFormat 不支持默认日期,换句话说:1970-01-01 是此格式化程序唯一固定的默认日期。如果您希望获得更大的灵活性,那么您可以在 Java-8 中使用 DateTimeFormatter

标签: java date simpledateformat


【解决方案1】:

不,SimpleDateFormat 需要明确输入字符串中的日期。如果您使用的是 Java 8,则可以使用 LocalDateTime

LocalDateTime localDateTime = LocalDate.now().atTime(5, 32, 21);

如果要包含时区,可以使用ZonedDateTime

【讨论】:

    【解决方案2】:

    构造另一个SimpleDateFormat 来打印今天的日期:

    String today = new SimpleDateFormat("yyyy/MM/dd").print(new Date());
    

    (这里要小心:您可能需要在SimpleDateFormat 上设置时区,因为“今天”在不同时区是不同的)。

    更新日期格式以包括年、月和日:

    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss z");
    

    然后在日期字符串前面加上你想要的日期:

    simpleDateFormat.parse(today + " " + "12:32:21 JST");
    

    【讨论】:

      【解决方案3】:

      使用灵活的默认值(今天而不是 1970-01-01)更好的解决方案是在 Java-8 中,新的内置日期时间库位于包 java.time

      String input = "12:32:21 JST";
      String pattern = "HH:mm:ss z";
      
      LocalDate today = LocalDate.now(ZoneId.of("Asia/Tokyo"));
      DateTimeFormatter dtf =
          new DateTimeFormatterBuilder().parseDefaulting(ChronoField.YEAR, today.getYear())
          .parseDefaulting(ChronoField.MONTH_OF_YEAR, today.getMonthValue()).parseDefaulting(
              ChronoField.DAY_OF_MONTH,
              today.getDayOfMonth()
          ).appendPattern(pattern).toFormatter(Locale.ENGLISH);
      ZonedDateTime zdt = ZonedDateTime.parse(input, dtf);
      System.out.println(zdt); // 2016-12-23T12:32:21+09:00[Asia/Tokyo]
      

      但是,我仍然看到一个小错误,即此代码在解析实际区域之前对已使用区域做出了硬连线假设,因此请小心处理。请记住,当前日期取决于区域。但也许您只需要处理用户只使用日本时间的场景。

      提示:也可以分两步解析。第一步,任意固定默认日期,获取待解析文本的区域信息。然后您可以将此区域信息用于上述建议的解决方案。一个尴尬但安全的过程。

      【讨论】:

        【解决方案4】:

        如果您只想更改年份和日期,可以使用此代码

        final SimpleDateFormat simpleDateFormatHour = new SimpleDateFormat("HH:mm:ss z");
        Date date = simpleDateFormatHour.parse("12:32:21 JST");
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        calendar.set(Calendar.YEAR, Calendar.getInstance().get(Calendar.YEAR));
        calendar.set(Calendar.DAY_OF_YEAR, Calendar.getInstance().get(Calendar.DAY_OF_YEAR));
        date = calendar.getTime();
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-05-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-12-07
          • 1970-01-01
          • 2012-11-09
          • 1970-01-01
          相关资源
          最近更新 更多