将字符串转换为java.util.date

时间:2013-09-13 08:04:59

标签: java date date-conversion

我正在使用需要转换为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);

时通过ParseException

有谁能帮我理解原因,也许可以提出解决方案?

6 个答案:

答案 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"

您可以查看SimpleDateFormat documentation

答案 3 :(得分:4)

解析日期时,您需要了解某些上下文或使用某些假设。您可以使用SimpleDateFormat,但在使用它之前,您可能需要预先解析字符串以查看它的格式。您可能需要尝试多种格式来查看是否有一种或多种方法来解析日期。

BTW是1930年2月1日凌晨01/02/30或2030年1月2日或2001年3月30日,您需要了解日期可能意味着什么或对格式有一定控制权。

答案 4 :(得分:1)

LocalDate

现代方法使用了 java.time 类,这些类取代了多年前麻烦的旧日期时间类(DateCalendar等)。

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/MontrealAfrica/CasablancaPacific/Auckland。切勿使用3-4个字母的缩写,例如ESTIST,因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)。

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.time框架已内置在Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendarSimpleDateFormat

目前位于Joda-Timemaintenance 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中添加内容提供了一个试验场。您可能会在这里找到一些有用的类,例如IntervalYearWeekYearQuartermore

答案 5 :(得分:0)

您需要使用以下日期模式List

尝试此代码,

string[]