【问题标题】:Why does sdf.format(date) converts 2018-12-30 to 2019-12-30 in java? [duplicate]为什么 sdf.format(date) 在 java 中将 2018-12-30 转换为 2019-12-30? [复制]
【发布时间】:2023-03-24 00:34:02
【问题描述】:

我正在尝试将日期转换为字符串,但转换时 2018 年更改为 2019 年。

我尝试了不同的日期,它有效。它仅在 2018 年 12 月 30 日和 12 月 31 日失败。

SimpleDateFormat fmt = new SimpleDateFormat("YYYY-MM-dd");
Date date = fmt.parse("2018-12-30");
String date2 = fmt.format(date);

预期结果:2018-12-30

实际结果:2019-12-30

【问题讨论】:

  • 什么是sdf??
  • fmt 似乎工作得很好,产生DateSun Dec 30 00:00:00 AEDT 2018sdf 设置是什么?另外,你真的应该使用java.time API 而不是这些过时的类
  • 我刚刚更新了 sdf 声明
  • 相关:stackoverflow.com/questions/15133549/…。如果你在谷歌上搜索“SimpleDateFormat YYYY vs yyyy”,那么你会发现几个链接,上面写着:“不要使用 YYYY”。
  • 我建议你不要使用SimpleDateFormatDate。这些类设计不佳且早已过时,尤其是前者,尤其是出了名的麻烦。而是使用来自java.time, the modern Java date and time APILocalDateDateTimeFormatter

标签: java date


【解决方案1】:

区分大小写

大写 YYYY 表示基于一周的年份而不是日历年(小写 yyyy)。

所以您看到的是功能,而不是错误。根据SimpleDateFormat使用的一周定义,2018年倒数第二天是2019年第一周。该定义因Locale 而异。

避免使用旧的日期时间类

您正在使用糟糕的日期时间类,这些类在几年前被 JSR 310 中定义的现代 java.time 类所取代。

LocalDate

LocalDate 类适合您的字符串输入。

String input = "2019-12-30" ;
LocalDate ld = LocalDate.parse( input ) ;

【讨论】:

  • 将 sdf 格式更改为 yyyy 有效。
  • 我愿意,@Dookoto_Sea。我仍然认为你应该自己和那些维护你的代码的人在你不使用SimpleDateFormat之后做。
【解决方案2】:

sdf 设置在哪里?只需使用fmt 即可。尝试关注。

SimpleDateFormat fmt = new SimpleDateFormat("yyyy-MM-dd");
Date date = fmt.parse("2018-12-30");
String date2 = fmt .format(date);

【讨论】:

    【解决方案3】:

    您无需再次使用SimpleDateFormat 格式化日期。如下使用即可。

    需要的日期格式:2019-12-30

    指定的适当日期格式为:yyyy.MM.dd(yyyy:代表全年)

    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
    Date date = simpleDateFormat.parse("2018-12-30");
    String sDate = simpleDateFormat.format(date);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-05-17
      • 1970-01-01
      • 1970-01-01
      • 2020-12-07
      • 2019-10-09
      • 2020-04-16
      • 1970-01-01
      • 2020-09-26
      相关资源
      最近更新 更多