我正在使用需要转换为java.util.date对象的日期字符串。
我正在使用以下代码执行此操作:
public void setDates(String from, String to) throws ParseException
{
Date fromDate = new Date();
Date toDate = new Date();
SimpleDateFormat df = new SimpleDateFormat("dd/MM/yyyy");
fromDate = df.parse(from);
toDate = df.parse(to);
this.setDepartDate(fromDate);
this.setReturnDate(toDate);
}
问题是我必须转换的字符串值总是(我无法控制),格式如下:“2013年9月20日”。
这导致我的函数在到达fromDate = df.parse(from);
有谁能帮我理解原因,也许可以提出解决方案?
答案 0 :(得分:6)
查看SimpleDateFormat
JavaDocs了解可用的格式选项,但基本上,您需要将日期格式更改为更像dd MMMM, yyyy
try {
String dateValue = "20 September, 2013";
SimpleDateFormat df = new SimpleDateFormat("dd MMMM, yyyy");
Date date = df.parse(dateValue);
System.out.println(date);
} catch (ParseException exp) {
exp.printStackTrace();
}
哪些输出......
Fri Sep 20 00:00:00 EST 2013
答案 1 :(得分:6)
根据javadoc使用以下格式
SimpleDateFormat df = new SimpleDateFormat("dd MMMMM, yyyy");
还要确定此解析是否需要Lenient以及是否需要严格使用setLenient(false)
默认情况下,解析是宽松的:如果输入不是使用的形式 通过这个对象的格式方法,但仍然可以解析为日期 解析成功了。客户可能会坚持严格遵守 通过调用setLenient(false)格式化。
另请注意,SimpleDateFormat
不是线程安全的。如果有选择,我建议使用提供更多增强功能的Joda Time Library。
答案 2 :(得分:5)
你写了
[...]采用以下格式:“2013年9月20日”。
然后你的SimpleDateFormat
应该是
"dd MMM, yyyy"
答案 3 :(得分:4)
解析日期时,您需要了解某些上下文或使用某些假设。您可以使用SimpleDateFormat,但在使用它之前,您可能需要预先解析字符串以查看它的格式。您可能需要尝试多种格式来查看是否有一种或多种方法来解析日期。
BTW是1930年2月1日凌晨01/02/30或2030年1月2日或2001年3月30日,您需要了解日期可能意味着什么或对格式有一定控制权。答案 4 :(得分:1)
LocalDate
现代方法使用了 java.time 类,这些类取代了多年前麻烦的旧日期时间类(Date
,Calendar
等)。
String input = "20 September, 2013" ;
Locale locale = Locale.US ; // Determines the human language and cultural norms used in parsing the input string.
DateTimeFormatter f = DateTimeFormatter.ofPattern( "d MMMM, uuuu" , locale ) ;
LocalDate ld = LocalDate.parse( input , f ) ;
请参阅此code run live at IdeOne.com。
ld.toString():2013-09-20
ZonedDateTime
如果您想要一个带有该日期的时间,例如一天中的第一时刻,则必须指定一个时区。时区对于确定日期至关重要。在任何给定时刻,日期都会在全球范围内变化。例如,Paris France午夜之后的几分钟是新的一天,而Montréal Québec仍然是“昨天”。
如果未指定时区,则JVM隐式应用其当前的默认时区。该默认值可能在运行时(!)期间change at any moment,因此您的结果可能会有所不同。最好将您的[期望/期望时区] [2]明确指定为参数。
以continent/region
的格式指定proper time zone name,例如America/Montreal
,Africa/Casablanca
或Pacific/Auckland
。切勿使用3-4个字母的缩写,例如EST
或IST
,因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)。
ZoneId z = ZoneId.of( "America/Montreal" ) ;
应用ZoneId
以获得ZonedDateTime
。永远不要假设一天从00:00:00开始。诸如夏令时(DST)之类的异常表示一天可能在另一个时间(例如01:00:00)开始。让 java.time 确定一天的第一时刻。
ZonedDateTime zdt = ld.atStartOfDay( z ) ;
Instant
要适应UTC,请提取Instant
。
Instant instant = zdt.toInstant() ;
java.time框架已内置在Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,Calendar
和SimpleDateFormat
。
目前位于Joda-Time的maintenance mode项目建议迁移到java.time类。
要了解更多信息,请参见Oracle Tutorial。并在Stack Overflow中搜索许多示例和说明。规格为JSR 310。
您可以直接与数据库交换 java.time 对象。使用符合JDBC driver或更高版本的JDBC 4.2。不需要字符串,不需要java.sql.*
类。
在哪里获取java.time类?
ThreeTen-Extra项目使用其他类扩展了java.time。该项目为将来可能在java.time中添加内容提供了一个试验场。您可能会在这里找到一些有用的类,例如Interval
,YearWeek
,YearQuarter
和more。
答案 5 :(得分:0)
您需要使用以下日期模式,List
尝试此代码,
string[]