import java.time.Instant;
import java.time.OffsetDateTime;
import java.time.ZonedDateTime;
class Main {
public static void main(String[] args) {
String strDateTime = "1997-02-14T00:00:00.0000000+05:30";
OffsetDateTime odt = OffsetDateTime.parse(strDateTime);
System.out.println(odt);
// Technically, you can also parse it into a ZonedDateTime but a ZonedDateTime
// is supposed to contain ZoneId along with ZoneOffset
System.out.println(ZonedDateTime.parse(strDateTime));
// With Java 12+, it is also possible to parse it into an Instant
System.out.println(Instant.parse(strDateTime));
}
}
class Main {
public static void main(String[] args) throws ParseException {
String strDateTime = "1997-02-14T00:00:00.0000000+05:30";
DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSSSSSXXX");
Date date = sdf.parse(strDateTime);
System.out.println(date);
}
}
7条答案
按热度按时间mkh04yzy1#
几个月前我自己也研究过这个问题。如果我没记错的话,SimpleDateFormat不够灵活,无法接受其他时区格式(我的是+530)。我所做的是一个简单的预处理步骤-即在将String传递给SimpleDateFormat之前,尝试删除冒号。
lmyy7pcs2#
你能不能不用正则表达式进行预处理并替换时区。
bn31dyow3#
Java 8 +
将 * 1997 - 02 - 14T00:00:00.0000000 + 05:30 * 表示为的最合适的类型是
OffsetDateTime
。请注意,java.time
API基于ISO 8601,因此无需指定DateTimeFormatter
来解析已经采用ISO 8601格式的日期时间字符串。从**Trail: Date Time**了解有关现代日期-时间API的更多信息。
只是为了完整
java.util
Date-Time API和它们的格式化APISimpleDateFormat
已经过时并且容易出错。自从Java-8发布(2014年3月)以来,强烈建议完全停止使用它们并切换到modern Date-Time API。但是,无论出于何种原因,如果您想坚持使用旧版API,您可以使用SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSSSSSXXX")
来解析字符串。3pmvbmvn4#
这是一个来自XML文件(ISO8601格式)的日期字符串吗?不幸的是,
SimpleDateFormat
没有(简单的)方法来解析它,这正是由于SimpleDateFormat
无法正确处理时区部分中的':'。看看我对另一个问题的回答,即如何解析XML日期时间字符串。
7gs2gvoe5#
当然,总是存在预处理String的方法。
如果没有人找到更好的答案,那就说明问题已经解决了。你可以把它封装在一个方法中,并加上一个注解来解释这个黑客攻击。
zlwx9yxi6#
SimpleDateFormat应接受此格式。来自文档:
对于解析,也接受常规时区。
具体如下:
看起来就像你的
如果失败了,那么Joda DateTimeFormat声称可以做到这一点。出于各种原因(更一致和更简单的API,格式化程序/解析程序的线程安全性等),我会忍不住使用Joda。
sg24os4d7#
我认为它应该使用
String
的replaceAll
方法来处理regular expression
。