【问题标题】:Java Date() giving the wrong date [duplicate]Java Date()给出错误的日期[重复]
【发布时间】:2013-02-12 15:32:27
【问题描述】:

我有一个简单的方法,它应该获取当前日期,将其转换为某种格式,然后将其作为字符串返回。到目前为止,一切都很好(最后一次尝试是在 1 月 31 日左右),但由于某种原因,当我今天尝试它时,它返回字符串“2013-02-43”。

现在显然 2 月份没有 43 天,我不知道为什么它会返回这个。我到处寻找解决方案,但似乎没有一个适合我遇到的具体问题。代码如下:

public String getDate(){
    DateFormat dateFormat = new SimpleDateFormat("YYYY-MM-DD");
    Date date = new Date();

    return dateFormat.format(date);
}

只是为了记录,我尝试使用 Calendar.getInstance() 等,结果相同。有趣的是,当我尝试时

get(Calendar.DAY_OF_MONTH) 

它返回 12,所以在某处数字是正确的,但在两者之间出现了问题。

谢谢

【问题讨论】:

  • "d" 非“D”指定“月中的日”,“M”而非“m”指定“年中的月”。从这种问题中获得声誉,我感到有点惭愧。
  • 作为记录,当 两个 不同的 API 没有产生结果时,您怀疑问题不太可能存在于 API 中。

标签: java date


【解决方案1】:

DD 表示年份,而dd 表示月份。此外,Y 表示周年,而y 表示年。你想要yyyy-MM-dd(区分大小写)。

public String getDate(){
    DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
    Date date = new Date();

    return dateFormat.format(date);
}

【讨论】:

  • 哦,哇,我太笨了,我的错。非常感谢!
  • 不应该把YYYY也换成yyyy吗?
【解决方案2】:

DateFormat 中的大写 D 是年份中的日期。您想要月份中的日期:

DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");

【讨论】:

    【解决方案3】:

    试试这个:“yyyy-MM-dd”

    区分大小写很重要。 “DD”是一年中的某一天。

    【讨论】:

      【解决方案4】:

      tl;博士

      LocalDate.now( ZoneId.of( "America/Montreal" ) )
               .toString()
      

      2016-12-24

      详情

      accepted Answer by Cashwell 正确:格式化模式代码不正确,区分大小写。

      使用 java.time

      更现代的方法是使用java.time 类。

      LocalDate

      LocalDate 类表示没有时间和时区的仅日期值。

      时区对于确定日期至关重要。对于任何给定的时刻,日期在全球范围内因区域而异。例如,Paris France 中午夜过后几分钟是新的一天,而 Montréal Québec 中仍然是“昨天”。

      ZoneId z = ZoneId.of( "America/Montreal" );
      LocalDate today = LocalDate.now( z );
      

      字符串

      您想要的输出恰好符合日期时间值的ISO 8601 标准文本格式。 java.time 类在解析/生成字符串时默认使用 ISO 8601。所以根本不需要指定格式模式!

      String output = today.toString() ;
      

      2016-12-24

      顺便说一句,虽然在这种情况下不需要这样做,但如果您要创建一个格式化模式,它看起来就像这个代码示例。代码与SimpleDateFormat的代码类似,但不完全相同,请仔细研究类文档。

      DateTimeFormatter f = DateTimeFormatter.ofPattern( "uuuu-MM-dd" );
      String output = today.format( f );
      

      通常最好将Locale 指定为习惯,但在这种特殊情况下不是必需的。


      关于java.time

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

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

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

      从哪里获得 java.time 类?

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

      【讨论】:

        【解决方案5】:

        阅读javadoc of SimpleDateFormatY 不存在,D 是一年中的某一天。您希望 yyyy-MM-dd 作为您的模式。

        【讨论】:

        • Y 在 Java 7 中被添加为“week-year”的占位符。
        【解决方案6】:

        您可能希望使用带有小写 d 的格式“yyyy-MM-dd”。大写 D 是年中日的格式。您可以找到日期模式的概述here

        【讨论】:

          【解决方案7】:

          您的格式字符串应该是"YYYY-MM-dd" 而不是"YYYY-MM-DD"

          DD 是“年中的日”,而dd 是“月中的日”。

          查看reference

          【讨论】:

          • 并且“yyyy”应该是小写的。
          【解决方案8】:

          看起来日期格式应该是小写的

          DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");

          返回 2013-02-12

          否则返回一年中的某一天。

          请参阅SimpleDateFormat API 页面了解接受的格式模式的完整列表。

          【讨论】:

            【解决方案9】:

            使用以下代码:

            SimpleDateFormat df = new SimpleDateFormat("YYYY-MM-dd");
            Date date = new Date();
            System.out.println(df.format(date));
            

            应该是dd 而不是DD

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2018-10-13
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2014-01-18
              • 1970-01-01
              • 2015-10-06
              相关资源
              最近更新 更多