1

我正在尝试将 2011 年 3 月 14 日解析为 Java 中的日期以用于时间转换器应用程序...我得到 2010 年 12 月 26 日...请帮助。

import java.util.*;
import java.text.*;

class date {
    public static void main(String[] args) {
      try {
        String timestampOrig = "11/03/14,15:00:00";
        SimpleDateFormat inFormat = new SimpleDateFormat("YY/MM/dd','HH:mm:ss");
        Date parseDate = inFormat.parse(timestampOrig);
        System.out.println("parsed date: " + parseDate.toString());
      }
      catch(ParseException pe){
      }
    }
}

输出:

解析日期:2010 年 12 月 26 日星期日 15:00:00 EST

4

2 回答 2

3

YY应该是yy(小写)。您可以在文档中找到可用字符列表及其含义。

出于好奇,关于 的更多信息YY,这是一周年的,在这里(不是 100% 确定它是诚实的)。

于 2013-01-27T11:11:14.847 回答
1

java.time

我正在使用现代 Java 日期和时间 API(自 2014 年 3 月起)java.time 提供现代答案。

    DateTimeFormatter inFormat = DateTimeFormatter.ofPattern("uu/MM/dd,HH:mm:ss");
    String timestampOrig = "11/03/14,15:00:00";
    LocalDateTime parsedDateTime = LocalDateTime.parse(timestampOrig, inFormat);
    System.out.println("parsed date: " + parsedDateTime.toString());

输出是:

解析日期:2011-03-14T15:00

我建议你不要使用SimpleDateFormatand Date。这些类设计不佳且早已过时,尤其是前者,尤其是出了名的麻烦。而是使用来自 java.time 的现代 Java 日期和时间 API 的 and LocalDateTimeDateTimeFormatter现代 API 使用起来要好得多。如果您尝试使用YY一年,顺便说一句,它会抛出异常,我发现这对捕获您的错误更有帮助。

格式模式字符串中逗号周围的引号是可选的。我知道文档推荐了它们,但我发现没有它们的格式模式字符串更具可读性,因此将它们排除在外。

你的代码出了什么问题?

格式模式字符串中的大写字母Y表示基于周的年份,仅对周数有用。显然SimpleDateFormat无法将您指定的月份和月份中的某天与 2011 年的基于周的年份结合起来,而是仅采用基于周的年份的第一天(这是 的典型行为SimpleDateFormat,给您一个不可能但错误的结果并假装一切都很好)。假设您的语言环境是美国或类似的,第 1 周是包含 1 月 1 日并从同一周的星期日开始的那一周,因此在这种情况下是上一年的最后一个星期日,即 2010 年 12 月 26 日。

使用 java.time 您可以使用小写字母yu年份。在底部链接的问题中解释了细微的差异。在任何情况下,两位数的年份都被解释为从 2000 年到 2099 年的范围(如果需要,有一些方法可以控制解释)。

链接

于 2019-09-07T12:04:30.100 回答