关于java:如何在不使用任何已弃用的类的情况下将日期从一种格式转换为另一种格式的另一种日期对象?

How do I convert the date from one format to another date object in another format without using any deprecated classes?

我想将date1格式的日期转换为date2格式的日期对象。

1
2
3
4
5
6
7
8
9
    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("MMMM dd, yyyy");
    SimpleDateFormat simpleDateFormat1 = new SimpleDateFormat("yyyyMMdd");
    Calendar cal = Calendar.getInstance();
    cal.set(2012, 8, 21);
    Date date = cal.getTime();
    Date date1 = simpleDateFormat.parse(date);
    Date date2 = simpleDateFormat.parse(date1);
    println date1
    println date2


使用SimpleDateFormat#format

1
2
3
4
DateFormat originalFormat = new SimpleDateFormat("MMMM dd, yyyy", Locale.ENGLISH);
DateFormat targetFormat = new SimpleDateFormat("yyyyMMdd");
Date date = originalFormat.parse("August 21, 2012");
String formattedDate = targetFormat.format(date);  // 20120821

另请注意,parse采用String,而不是Date对象,该对象已经过解析。


TL;博士

1
2
3
4
LocalDate.parse(
   "January 08, 2017" ,
    DateTimeFormatter.ofPattern("MMMM dd, uuuu" , Locale.US )
).format( DateTimeFormatter.BASIC_ISO_DATE )

使用java.time

问题和其他答案使用麻烦的旧日期时间类,现在是旧的,由java.time类取代。

您有仅限日期的值,因此请使用仅限日期的类。 LocalDate类表示没有时间且没有时区的仅日期值。

1
2
3
4
String input ="January 08, 2017";
Locale l = Locale.US ;
DateTimeFormatter f = DateTimeFormatter.ofPattern("MMMM dd, uuuu" , l );
LocalDate ld = LocalDate.parse( input , f );

您所需的输出格式由ISO 8601标准定义。对于仅日期值,"扩展"格式为YYYY-MM-DD,例如2017-01-08,并且最小化分隔符使用的"基本"格式为YYYYMMDD,例如20170108

我强烈建议使用扩展格式以提高可读性。但是如果你坚持基本格式,那格式化程序就被预定义为名为BASIC_ISO_DATEDateTimeFormatter类的常量。

1
String output = ld.format( DateTimeFormatter.BASIC_ISO_DATE );

请参阅IdeOne.com上的此代码。

ld.toString(): 2017-01-08

output: 20170108

关于java.time

java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧遗留日期时间类,例如java.util.DateCalendar和& SimpleDateFormat

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

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

从哪里获取java.time类?

  • Java SE 8和SE 9及更高版本

    • 内置。
    • 带有捆绑实现的标准Java API的一部分。
    • Java 9增加了一些小功能和修复。
  • Java SE 6和SE 7

    • 许多java.time功能都被反向移植到Java 6& 7在ThreeTen-Backport。
  • Android的

    • ThreeTenABP项目特别适用于Android的ThreeTen-Backport(如上所述)。
    • 请参见如何使用ThreeTenABP ....

ThreeTen-Extra项目使用其他类扩展了java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的类,例如IntervalYearWeekYearQuarter等。


使用Java 8,我们可以实现如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
private static String convertDate(String strDate)
{
    //for strdate = 2017 July 25

    DateTimeFormatter f = new DateTimeFormatterBuilder().appendPattern("yyyy MMMM dd")
                                        .toFormatter();

    LocalDate parsedDate = LocalDate.parse(strDate, f);
    DateTimeFormatter f2 = DateTimeFormatter.ofPattern("MM/d/yyyy");

    String newDate = parsedDate.format(f2);

    return newDate;
}

输出将是:"07/25/2017"


请参考以下方法。它将您的日期String作为argument1,您需要指定日期的现有格式
作为参数2,结果(预期)格式为参数3。

请参阅此链接以了解各种格式:
可用日期格式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public static String formatDateFromOnetoAnother(String date,String givenformat,String resultformat) {

    String result ="";
    SimpleDateFormat sdf;
    SimpleDateFormat sdf1;

    try {
        sdf = new SimpleDateFormat(givenformat);
        sdf1 = new SimpleDateFormat(resultformat);
        result = sdf1.format(sdf.parse(date));
    }
    catch(Exception e) {
        e.printStackTrace();
        return"";
    }
    finally {
        sdf=null;
        sdf1=null;
    }
    return result;
}

Kotlin相当于Jo?o Silva回答的答案

1
2
3
 fun getFormattedDate(originalFormat: SimpleDateFormat, targetFormat: SimpleDateFormat, inputDate: String): String {
    return targetFormat.format(originalFormat.parse(inputDate))
}

用法(在Android中):

1
2
3
4
5
getFormattedDate(
            SimpleDateFormat(FormatUtils.d_MM_yyyy, Locale.getDefault()),
            SimpleDateFormat(FormatUtils.d_MMM_yyyy, Locale.getDefault()),
            dateOfTreatment
    )

注意:常量值:

1
2
3
4
5
// 25 Nov 2017
val d_MMM_yyyy ="d MMM yyyy"

// 25/10/2017
val d_MM_yyyy ="d/MM/yyyy"


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;

             String fromDateFormat ="dd/MM/yyyy";
             String fromdate = 15/03/2018; //Take any date

             String CheckFormat ="dd MMM yyyy";//take another format like dd/MMM/yyyy
             String dateStringFrom;

             Date DF = new Date();


              try
              {
                 //DateFormatdf = DateFormat.getDateInstance(DateFormat.SHORT);
                 DateFormat FromDF = new SimpleDateFormat(fromDateFormat);
                 FromDF.setLenient(false);  // this is important!
                 Date FromDate = FromDF.parse(fromdate);
                 dateStringFrom = new
                 SimpleDateFormat(CheckFormat).format(FromDate);
                 DateFormat FromDF1 = new SimpleDateFormat(CheckFormat);
                 DF=FromDF1.parse(dateStringFrom);
                 System.out.println(dateStringFrom);
              }
              catch(Exception ex)
              {

                  System.out.println("Date error");

              }

output:- 15/03/2018
         15 Mar 2018


试试这个

这是将一种日期格式更改为另一种日期格式的最简单方法

1
2
3
4
5
6
7
8
9
10
11
public String changeDateFormatFromAnother(String date){
    @SuppressLint("SimpleDateFormat") DateFormat inputFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
    @SuppressLint("SimpleDateFormat") DateFormat outputFormat = new SimpleDateFormat("dd MMMM yyyy");
    String resultDate ="";
    try {
        resultDate=outputFormat.format(inputFormat.parse(date));
    } catch (ParseException e) {
        e.printStackTrace();
    }
    return resultDate;
}

希望这会对某人有所帮助。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 public static String getDate(
        String date, String currentFormat, String expectedFormat)
throws ParseException {
    // Validating if the supplied parameters is null
    if (date == null || currentFormat == null || expectedFormat == null ) {
        return null;
    }
    // Create SimpleDateFormat object with source string date format
    SimpleDateFormat sourceDateFormat = new SimpleDateFormat(currentFormat);
    // Parse the string into Date object
    Date dateObj = sourceDateFormat.parse(date);
    // Create SimpleDateFormat object with desired date format
    SimpleDateFormat desiredDateFormat = new SimpleDateFormat(expectedFormat);
    // Parse the date into another format
    return desiredDateFormat.format(dateObj).toString();
}

1
2
3
4
5
6
7
8
9
    //Convert input format 19-FEB-16 01.00.00.000000000 PM to 2016-02-19 01.00.000 PM
    SimpleDateFormat inFormat = new SimpleDateFormat("dd-MMM-yy hh.mm.ss.SSSSSSSSS aaa");
    Date today = new Date();        

    Date d1 = inFormat.parse("19-FEB-16 01.00.00.000000000 PM");

    SimpleDateFormat outFormat = new SimpleDateFormat("yyyy-MM-dd hh.mm.ss.SSS aaa");

    System.out.println("Out date ="+outFormat.format(d1));