【问题标题】:java parsing string to datejava解析字符串到日期
【发布时间】:2013-01-27 11:08:58
【问题描述】:

我正在尝试将 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

【问题讨论】:

  • 您将获得带有该日期字符串的 3 月 14 日 - 可能是 05 而不是 03
  • @RachelGallen 进行了相应的编辑...谢谢
  • 仅供参考,java.util.Datejava.util.Calendarjava.text.SimpleDateFormat 等非常麻烦的日期时间类现在是 legacy,被 Java 8 及更高版本中内置的 java.time 类所取代.在Answer by Ole V.V. 中查看现代解决方案

标签: java parsing date format


【解决方案1】:

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

出于好奇,关于YY 的更多信息,这是一周年here(说实话,不是 100% 确定它是什么)。

【讨论】:

  • 是的...区分大小写的意义就这么大了!!! ...在我不明白的事情上浪费了将近 4-5 个小时...但它有效...我很高兴 :)
  • 仅供参考,基于周的年是另一种日历,专注于跟踪整周而不是 1 月 1 日至 12 月 31 日。一周的定义各不相同。一个定义可能是一周从 1 月 1 日或之前的第一个星期日开始。因此,基于周的年份可能从上一个日历年的 12 月 29 日开始。有关更多信息,请阅读标准 ISO 8601 week,其中第 1 周从星期一开始,包含日历年的第一个星期四,因此每年正好有 52 或 53 周,每周有整整 7 天。
【解决方案2】:

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

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

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

你的代码出了什么问题?

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

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

链接

【讨论】:

    猜你喜欢
    • 2016-04-21
    • 2013-06-05
    • 1970-01-01
    • 1970-01-01
    • 2011-07-21
    • 2012-10-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多