【问题标题】:Java Date object from String not working properly来自 String 的 Java Date 对象无法正常工作
【发布时间】:2013-01-22 10:51:17
【问题描述】:

我遇到了一个似乎无法解决的顽固问题。我在 stackoverflow 上寻找了解决方案,并找到了很多关于 Java 日期格式的帖子,但没有针对我遇到的问题。

基本上,我需要将日期字符串转换为 java.util.Date 对象。我正在使用 Date 和 SimpleDateFormat 类。对于我遇到的大多数日期,它工作得很好。但是对于某些日期,它可以工作,但会更改实际日期。两个示例日期是:

2012 年 2 月 24 日星期五 16:45:40 PST --> 更改为 --> 2012 年 1 月 6 日星期五 16:45:40 PST

2012 年 6 月 13 日星期三 10:00:42 PDT --> 更改为 --> 2012 年 1 月 4 日星期三 09:00:42 PST

知道为什么日期会更改吗?有什么方法可以轻松避免这种情况或以不同的方式做到这一点?我的代码复制如下。你可以试试看我在说什么。

提前致谢!

您可以使用以下 JSP 代码进行尝试:

<%@ page import="java.util.*" %>
<%@ page import="java.net.*" %>
<%@ page import="java.io.*" %>
<%@ page import="java.text.*" %>

<%
String dateStr = "";
Date tmpDate = null;
DateFormat formatter = new SimpleDateFormat("EEE MMM dd HH:mm:ss z YYYY");

System.out.println("First Test ---------------");
dateStr = "Fri Feb 24 16:45:40 PST 2012";
tmpDate = (Date) formatter.parse(dateStr);
System.out.println("Original:"+dateStr+":");
System.out.println("Date Obj:"+tmpDate.toString()+":");

System.out.println("Second Test --------------");
dateStr = "Wed Jun 13 10:00:42 PDT 2012";
tmpDate = (Date) formatter.parse(dateStr);
System.out.println("Original:"+dateStr+":");
System.out.println("Date Obj:"+tmpDate.toString()+":");

%>

我得到以下输出:

First Test ------------
Original:Fri Feb 24 16:45:40 PST 2012:
Date Obj:Fri Jan 06 16:45:40 PST 2012:
Second Test -----------
Original:Wed Jun 13 10:00:42 PDT 2012:
Date Obj:Wed Jan 04 09:00:42 PST 2012:

【问题讨论】:

  • 好像 Y 和 y 是不同的字符或什么的。不过,它甚至不应该编译日期模式,至少对我来说不会。
  • +1 对于一个写得很好的问题。
  • 如果我正确地认为问题可以很容易地在纯 Java 中重现(也是@PaulBellora),我应该更喜欢问题中的代码中遗漏的 JSP。否则问题很好,MCVE 和一切。

标签: java string date simpledateformat


【解决方案1】:

在格式字符串中使用 yyyy 而不是 YYYY。

YYYY是个很特别的东西,日历周年。

有关详细信息,请参阅SimpleDateFormat 文档。

【讨论】:

  • 啊,精彩的观察。我查看了文档,但不确定为什么我使用 YYYY,尽管 SimpleDateFormat Javadoc 中甚至没有列出大写选项。对于遇到此问题的其他人,以下格式对我有用: new SimpleDateFormat("EEE MMM dd HH:mm:ss z yyyy");
  • @Mohammad 是的,定义这些格式符号的 ISO 规范是一个陷阱,糟糕的设计。这确实是反直觉的。这就是为什么 SO 每 5 天就会出现这样一个问题的原因。
【解决方案2】:

您在格式说明符中使用 YYYY,即 week year(请参阅 SimpleDateFormat)。你需要 yyyy,这只是“年”。

我怀疑错误的结果是因为您还指定了月份和日期,而这并不是星期几中真正的“特征”。当您使用星期年份时,您会指定“星期几”和“星期几”,它可能会给出一些更合理的结果,但显然您并不是真的打算使用星期年份。

我建议您在代码中指定您的语言环境。当然它会在你的机器上完美运行,但它可能会在中国等其他地方引起unparsable date exception

DateFormat formatter = new SimpleDateFormat("EEE MMM dd HH:mm:ss z yyyy", Locale.ENGLISH);

【讨论】:

  • 非常感谢您的解释。我意识到我忽略了语言环境的重要性。
猜你喜欢
  • 2020-12-21
  • 1970-01-01
  • 2021-08-04
  • 2020-02-15
  • 2013-05-29
  • 1970-01-01
  • 1970-01-01
  • 2021-08-26
  • 2014-09-06
相关资源
最近更新 更多