在Java中使用不同格式将字符串解析为日期

Gna*_*air 87 java string date

我想转换StringDate不同的格式.

例如,

我来自用户,

String fromDate = "19/05/2009"; // i.e. (dd/MM/yyyy) format
Run Code Online (Sandbox Code Playgroud)

我想将其转换fromDate"yyyy-MM-dd"格式的Date对象

我怎样才能做到这一点?

Mic*_*ers 176

看看SimpleDateFormat.代码如下:

SimpleDateFormat fromUser = new SimpleDateFormat("dd/MM/yyyy");
SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd");

try {

    String reformattedStr = myFormat.format(fromUser.parse(inputString));
} catch (ParseException e) {
    e.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)

  • @Rachel:当然,只需使用`parse`而不要继续`format`.`parse`将String解析为Date. (4认同)
  • 但是`parse`给我的'date format`作为`Fri Jan 06 00:01:00 EST 2012`但它需要``2012-01-06`日期格式 (3认同)
  • 仅供参考,麻烦的旧日期时间类,例如[`java.util.Date`](https://docs.oracle.com/javase/9​​/docs/api/java/util/Date.html),[` java.util.Calendar`](https://docs.oracle.com/javase/9​​/docs/api/java/util/Calendar.html)和`java.text.SimpleDateFormat`现在都是[旧版](https ://en.wikipedia.org/wiki/Legacy_system),由[* java.time *](https://docs.oracle.com/javase/9​​/docs/api/java/time/package-summary取代Java 8和Java 9中内置的.html)类。请参见[* Oracle的Tutorial *](https://docs.oracle.com/javase/tutorial/datetime/TOC.html)。 (2认同)

小智 12

使用SimpleDateFormat课程:

private Date parseDate(String date, String format) throws ParseException
{
    SimpleDateFormat formatter = new SimpleDateFormat(format);
    return formatter.parse(date);
}
Run Code Online (Sandbox Code Playgroud)

用法:

Date date = parseDate("19/05/2009", "dd/MM/yyyy");
Run Code Online (Sandbox Code Playgroud)

为了提高效率,您需要将格式化程序存储在散列映射中.hashmap是util类的静态成员.

private static Map<String, SimpleDateFormat> hashFormatters = new HashMap<String, SimpleDateFormat>();

public static Date parseDate(String date, String format) throws ParseException
{
    SimpleDateFormat formatter = hashFormatters.get(format);

    if (formatter == null)
    {
        formatter = new SimpleDateFormat(format);
        hashFormatters.put(format, formatter);
    }

    return formatter.parse(date);
}
Run Code Online (Sandbox Code Playgroud)

  • 警告!!这个想法很好,但实施却不是.不能静态存储DateFormats,因为它们不是线程安全的!如果它们来自多个线程(这对于静态来说总是有风险).FindBugs包含一个探测器(在我被咬之后,我最初做出了贡献.请参阅http://dschneller.blogspot.com/2007/04/calendar-dateformat-and-multi-threading.html :-)) (9认同)

Bas*_*que 11

TL;博士

LocalDate.parse( 
    "19/05/2009" , 
    DateTimeFormatter.ofPattern( "dd/MM/uuuu" ) 
)
Run Code Online (Sandbox Code Playgroud)

细节

其他答案用java.util.Date,java.sql.DateSimpleDateFormat现在已经过时.

LocalDate

日常时间的现代方法是使用java.time类,特别是LocalDate.该LocalDate级表示没有时间一天和不同时区的日期,唯一的价值.

DateTimeFormatter

要解析或生成表示日期时间值的String,请使用DateTimeFormatter该类.

DateTimeFormatter f = DateTimeFormatter.ofPattern( "dd/MM/uuuu" );
LocalDate ld = LocalDate.parse( "19/05/2009" , f );
Run Code Online (Sandbox Code Playgroud)

不要将日期时间对象与表示其值的String混淆.一个日期时间对象没有格式,而字符串中.日期时间对象(例如LocalDate)可以生成表示其内部值的String,但日期时间对象和String是不同的不同对象.

您可以指定任何自定义格式以生成String.或者让java.time完成自动本地化的工作.

DateTimeFormatter f = 
    DateTimeFormatter.ofLocalizedDate( FormatStyle.FULL )
                     .withLocale( Locale.CANADA_FRENCH ) ;
String output = ld.format( f );
Run Code Online (Sandbox Code Playgroud)

转储到控制台.

System.out.println( "ld: " + ld + " | output: " + output );
Run Code Online (Sandbox Code Playgroud)

ld:2009-05-19 | 输出:mardi 19 mai 2009

请参阅IdeOne.com中的操作.


关于java.time

java.time框架是建立在Java 8和更高版本.这些类取代麻烦的老传统日期时间类,如java.util.Date,Calendar,和SimpleDateFormat.

现在处于维护模式Joda-Time项目建议迁移到java.time类.

要了解更多信息,请参阅Oracle教程.并搜索Stack Overflow以获取许多示例和解释.规范是JSR 310.

您可以直接与数据库交换java.time对象.使用符合JDBC 4.2或更高版本的JDBC驱动程序.不需要字符串,不需要课程.java.sql.*

从哪里获取java.time类?

ThreeTen-额外项目与其他类扩展java.time.该项目是未来可能添加到java.time的试验场.您可以在此比如找到一些有用的类Interval,YearWeek,YearQuarter,和更多.


Rit*_*hik 7

将字符串日期转换为java.sql.Date

String fromDate = "19/05/2009";
DateFormat df = new SimpleDateFormat("dd/MM/yyyy");
java.util.Date dtt = df.parse(fromDate);
java.sql.Date ds = new java.sql.Date(dtt.getTime());
System.out.println(ds);//Mon Jul 05 00:00:00 IST 2010
Run Code Online (Sandbox Code Playgroud)


Mat*_*att 5

检查javadocs,java.text.SimpleDateFormat它描述了你需要的一切.