非法模式字符 'T'将日期字符串解析为 java.util.Date 时
我有一个日期字符串,我想使用 java Date API 将其解析为正常日期,以下是我的代码:
public static void main(String[] args) {
String date="2010-10-02T12:23:23Z";
String pattern="yyyy-MM-ddThh:mm:ssZ";
SimpleDateFormat sdf=new SimpleDateFormat(pattern);
try {
Date d=sdf.parse(date);
System.out.println(d.getYear());
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
但是我遇到了异常: java.lang.IllegalArgumentException: 非法模式字符 'T'
所以我想知道是否必须拆分字符串并手动解析它?
顺便说一句,我尝试在 T 的两侧添加单引号字符:
String pattern="yyyy-MM-dd'T'hh:mm:ssZ";
它也不起作用。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
Java 8 及更高版本的更新
您现在可以简单地执行
Instant.parse("2015-04-28T14:23:38.521Z")
并立即获得正确的结果,特别是因为您应该使用Instant
而不是最新版本 Java 中损坏的java.util.Date
。您还应该使用
DateTimeFormatter
而不是SimpleDateFormatter
。原答案:
这适用于带有尾随
Z
的输入,如下所示:Q2597083.java
产生以下输出:
Update for Java 8 and higher
You can now simply do
Instant.parse("2015-04-28T14:23:38.521Z")
and get the correct thing now, especially since you should be usingInstant
instead of the brokenjava.util.Date
with the most recent versions of Java.You should be using
DateTimeFormatter
instead ofSimpleDateFormatter
as well.Original Answer:
This works with the input with the trailing
Z
as demonstrated:Q2597083.java
Produces the following output:
tl;dr
使用 java.time.Instant 类解析标准 ISO 8601 格式的文本,表示 UTC 中的某个时刻。
ISO 8601
该格式由日期时间字符串格式的 ISO 8601 标准定义。
两者:
...默认使用 ISO 8601 格式来解析和生成字符串。
通常,您应该避免使用旧的 java.util.Date/.Calendar & java.text.SimpleDateFormat 类是出了名的麻烦、混乱且有缺陷。如果需要互操作,可以来回转换。
java.time
内置于 Java 8 及更高版本中,是新的 java.time 框架。灵感来自 Joda-Time,由 JSR 310,并由 三十额外项目。
转换为旧类。
时区
如果需要,您可以指定时区。
转变。
Joda-Time
更新:Joda-Time 项目现在处于维护模式。该团队建议迁移到 java.time 类。
这是 Joda-Time 2.8 中的一些示例代码。
转换为旧类。请注意,分配的时区在转换过程中会丢失,因为 juDate 无法分配时区。
时区
如果需要,您可以指定时区。
关于 java.time
java.time 框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧遗留日期时间类,例如
java.util.Date
,日历
,&SimpleDateFormat
。Joda-Time 项目,现已在 维护模式,建议迁移到 java.time 类。
要了解更多信息,请参阅 Oracle 教程 。并在 Stack Overflow 上搜索许多示例和解释。规范为 JSR 310。
您可以直接与数据库交换java.time对象。使用符合 JDBC 驱动程序 jeps/170" rel="noreferrer">JDBC 4.2 或更高版本。不需要字符串,不需要 java.sql.* 类。
从哪里获取 java.time 类?
ThreeTen-Extra 项目通过附加类扩展了 java.time。该项目是 java.time 未来可能添加的内容的试验场。您可能会在这里找到一些有用的类,例如
Interval
,YearWeek
,YearQuarter
,以及更多。tl;dr
Use
java.time.Instant
class to parse text in standard ISO 8601 format, representing a moment in UTC.ISO 8601
That format is defined by the ISO 8601 standard for date-time string formats.
Both:
…use ISO 8601 formats by default for parsing and generating strings.
You should generally avoid using the old java.util.Date/.Calendar & java.text.SimpleDateFormat classes as they are notoriously troublesome, confusing, and flawed. If required for interoperating, you can convert to and fro.
java.time
Built into Java 8 and later is the new java.time framework. Inspired by Joda-Time, defined by JSR 310, and extended by the ThreeTen-Extra project.
Convert to the old class.
Time Zone
If needed, you can assign a time zone.
Convert.
Joda-Time
UPDATE: The Joda-Time project is now in maintenance mode. The team advises migration to the java.time classes.
Here is some example code in Joda-Time 2.8.
Convert to old class. Note that the assigned time zone is lost in conversion, as j.u.Date cannot be assigned a time zone.
Time Zone
If needed, you can assign a time zone.
About java.time
The java.time framework is built into Java 8 and later. These classes supplant the troublesome old legacy date-time classes such as
java.util.Date
,Calendar
, &SimpleDateFormat
.The Joda-Time project, now in maintenance mode, advises migration to the java.time classes.
To learn more, see the Oracle Tutorial. And search Stack Overflow for many examples and explanations. Specification is JSR 310.
You may exchange java.time objects directly with your database. Use a JDBC driver compliant with JDBC 4.2 or later. No need for strings, no need for
java.sql.*
classes.Where to obtain the java.time classes?
The ThreeTen-Extra project extends java.time with additional classes. This project is a proving ground for possible future additions to java.time. You may find some useful classes here such as
Interval
,YearWeek
,YearQuarter
, and more.您可以使用以下方法将字符串解析为时间戳:
You can parse string to Timestamp with the following method:
到目前为止,上面有两个答案,它们都很长(恕我直言,tl;dr太短了),所以我根据我开始使用新的java.time 库(适用于 Java 的其他答案中所述版本 8+)。 ISO 8601 设置了书写日期的标准方式:< code>YYYY-MM-DD 因此日期时间的格式仅如下(可以是 0、3、6 或 9 位数字表示毫秒)并且不需要格式化字符串:
我不需要它,但作为获取年份是问题的代码,然后:
它比较棘手,不能直接从
Instant
完成,可以通过Calendar
以问题的方式完成在 Java 中获取当前年份的整数值 和 将 java.time 转换为 Calendar 但恕我直言,因为格式是固定子字符串,使用起来更简单:There are two answers above up-to-now and they are both long (and tl;dr too short IMHO), so I write summary from my experience starting to use new java.time library (applicable as noted in other answers to Java version 8+). ISO 8601 sets standard way to write dates:
YYYY-MM-DD
so the format of date-time is only as below (could be 0, 3, 6 or 9 digits for milliseconds) and no formatting string necessary:I did not need it, but as getting year is in code from the question, then:
it is trickier, cannot be done from
Instant
directly, can be done viaCalendar
in way of questions Get integer value of the current year in Java and Converting java.time to Calendar but IMHO as format is fixed substring is more simple to use: