在Java中将字符串解析为具有不同格式的日期


91

我想转换StringDate不同的格式。

例如,

我从用户那里得到

String fromDate = "19/05/2009"; // i.e. (dd/MM/yyyy) format

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

我怎样才能做到这一点?


2
Date对象没有格式,只是代表日期的数字。日期可以用格式为“ yyyy-MM-dd”的字符串表示。
user85421

Answers:


181

看一看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();
}

1
我可以获取Date格式输出,而不是获取字符串格式吗?
雷切尔2012年

4
@Rachel:当然可以parse,请继续使用,不要继续formatparse将字符串解析为日期。
迈克尔·迈尔斯

3
但是请按日期格式显示parsedate formatFri Jan 06 00:01:00 EST 2012需要的2012-01-06
Rachel

1
@Rachel是因为当您调用System.out.println(anyDateObject)默认的toString()方法时,该方法被称为以该格式打印,例如Fri Jan 06 00:01:00 EST 2012。您需要覆盖它以适合您的需求。
KNU

3
仅供参考,麻烦的旧日期,时间类,如java.util.Datejava.util.Calendarjava.text.SimpleDateFormat现在的遗产,由取代java.time内置到Java 8的Java 9.请参见类教程由Oracle
罗勒·布尔克

13

tl; dr

LocalDate.parse( 
    "19/05/2009" , 
    DateTimeFormatter.ofPattern( "dd/MM/uuuu" ) 
)

细节

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

LocalDate

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

DateTimeFormatter

要解析或生成表示日期时间值的字符串,请使用DateTimeFormatter此类。

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

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

您可以指定任何自定义格式来生成字符串。或者让java.time做自动本地化的工作。

DateTimeFormatter f = 
    DateTimeFormatter.ofLocalizedDate( FormatStyle.FULL )
                     .withLocale( Locale.CANADA_FRENCH ) ;
String output = ld.format( f );

转储到控制台。

System.out.println( "ld: " + ld + " | output: " + output );

ld:2009-05-19 | 输出:2009年3月19日狂欢节

请参阅IdeOne.com中的实际操作


关于java.time

java.time框架是建立在Java 8和更高版本。这些类取代麻烦的老传统日期时间类,如java.util.DateCalendar,和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中添加内容提供了一个试验场。你可能在这里找到一些有用的类,比如IntervalYearWeekYearQuarter,和更多


12

使用SimpleDateFormat类:

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

用法:

Date date = parseDate("19/05/2009", "dd/MM/yyyy");

为了提高效率,您可能希望将格式程序存储在哈希图中。哈希图是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);
}

9
警告!!这个主意很好,但是实现却不是。DateFormats不能静态存储,因为它们不是线程安全的!如果从多个线程中使用它们(使用静态方法总是有风险的)。FindBugs的包含此探测器(我正好开始贡献,我被咬伤后见。dschneller.blogspot.com/2007/04/... :-))
丹尼尔Schneller

您的博客文章很有趣:-)如果我同步parseDate方法本身,该怎么办?但是,问题在于,这可能会减慢代码的速度……
Agora

1
只要parseDate方法是访问地图的唯一方法,就可以对其进行同步。但这正如您所说的那样会带来瓶颈。
丹尼尔·施奈勒

8

将字符串日期转换为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


3

虽然SimpleDateFormat确实可以满足您的需求,但您可能还需要查看Joda Time,它显然是Java 7中重做的Date库的基础。虽然我没有使用很多,但除了好东西我什么都听不到关于它,如果您在项目中广泛地处理日期,那么可能值得研究。


1

格式化日期并转换为字符串的简单方法

    Date date= new Date();

    String dateStr=String.format("%td/%tm/%tY", date,date,date);

    System.out.println("Date with format of dd/mm/dd: "+dateStr);

输出:日期格式为dd / mm / dd:21/10/2015


1

一个Date对象没有格式,它是一个表示。日期可以String您喜欢格式以表示。

例如“ yyyy-MM-dd”,“ yy-MMM-dd”,“ dd-MMM-yy”等。

为此,您可以使用 SimpleDateFormat

试试这个,

        String inputString = "19/05/2009"; // i.e. (dd/MM/yyyy) format

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

        try {
            Date dateFromUser = fromUser.parse(inputString); // Parse it to the exisitng date pattern and return Date type
            String dateMyFormat = myFormat.format(dateFromUser); // format it to the date pattern you prefer
            System.out.println(dateMyFormat); // outputs : 2009-05-19

        } catch (ParseException e) {
            e.printStackTrace();
        }

输出:2009-05-19


1

假设您有一个像这样的字符串:

String mDate="2019-09-17T10:56:07.827088"

现在我们要用JavaKotlinString分别更改此格式的日期和时间。

JAVA:

我们有一个提取日期的方法:

public String getDate() {
    try {
        DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS", Locale.US);
        Date date = dateFormat.parse(mDate);
        dateFormat = new SimpleDateFormat("MM/dd/yyyy", Locale.US);
        return dateFormat.format(date);
    } catch (ParseException e) {
        e.printStackTrace();
    }
    return null;
}

Return 这是:09/17/2019

我们有提取时间的方法:

public String getTime() {

    try {
        DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS", Locale.US);
        Date date = dateFormat.parse(mCreatedAt);
        dateFormat = new SimpleDateFormat("h:mm a", Locale.US);
        return dateFormat.format(date);
    } catch (ParseException e) {
        e.printStackTrace();
    }
    return null;
}

Return这是: 上午10:56

科特琳:

我们有一个提取日期的功能:

fun getDate(): String? {

    var dateFormat = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS", Locale.US)
    val date = dateFormat.parse(mDate!!)
    dateFormat = SimpleDateFormat("MM/dd/yyyy", Locale.US)
    return dateFormat.format(date!!)
}

Return 这是:09/17/2019

我们有提取时间的方法:

fun getTime(): String {

    var dateFormat = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS", Locale.US)
    val time = dateFormat.parse(mDate!!)
    dateFormat = SimpleDateFormat("h:mm a", Locale.US)
    return dateFormat.format(time!!)
}

Return这是: 上午10:56


请不要教年轻的孩子们使用已经过时且臭名昭著的SimpleDateFormat课程。至少不是第一选择。也并非毫无保留。今天,我们在java.timeJava的现代日期和时间API及其上有了很多改进DateTimeFormatter。也SimpleDateFormat无法正确解析秒(微秒)上的6位小数。
Ole VV

当我运行第二个代码片段时,并没有达到10:56 AM您的要求,而是11:09 AM(在Oracle jdk-11.0.3上进行了测试)。
Ole VV

@ OleV.V。,如果某个方法早已过时,则将不赞成使用它,并在其上用一行作为标志;如果不赞成使用某个方法或类,则可以使用它,我不是说这是最好的方法,也许我们有更好的方法,但是这种方法简单易懂,如果某个方法或类过时,则没有理由认为它很麻烦,使用DateTimeFormatter我们需要达到minsdk 26或更高的要求不是一件好事
milad salimi

@ OleV.V。但是,感谢您的评论和您的第二条评论,我可以说我在两次申请中对其进行了多次检查,然后返回10:56 AM
milad salimi

1
@ OleV.V。,好的,但是我无法使用某个库,或者我的API(library)比我的代码好得多时,我会使用一个库,因为当您添加库时,会向您的项目中添加一些可能无法使用的代码,这对您来说是重载的项目,这是我的方法,您的方法对我而言很受人尊敬。
milad salimi
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.