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

Pho*_*nix 42 java

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

    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
Run Code Online (Sandbox Code Playgroud)

Joã*_*lva 111

用途SimpleDateFormat#format:

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
Run Code Online (Sandbox Code Playgroud)

另请注意,parse采用已解析的 a String而非Date对象.

  • 虽然这个答案在当时是最好的答案,但我应该建议访问者现在访问该网站,因为这些天使用的课程被认为是遗留的。参考 Java 8 的答案现在是执行此操作的首选方法。 (4认同)
  • 你需要包装 Date parsedDate = simpleDateFormat1.parse(formattedDate); 使用 try catch,因为它会抛出 parseException。 (2认同)
  • @Phoenix:你是否将`Locale`设置为第一个`SimpleDateFormat`的`Locale.ENGLISH`?否则,如果您使用的是非英语`Locale`,则"August"将无法正确解析并将抛出ParseException. (2认同)

Kay*_*ayV 6

从 Java 8 开始,我们可以按如下方式实现:

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;
}
Run Code Online (Sandbox Code Playgroud)

输出将是:“07/25/2017”


Bas*_*que 5

tl; dr

LocalDate.parse( 
    "January 08, 2017" , 
    DateTimeFormatter.ofPattern( "MMMM dd, uuuu" , Locale.US ) 
).format( DateTimeFormatter.BASIC_ISO_DATE ) 
Run Code Online (Sandbox Code Playgroud)

使用java.time

“问题”和“其他答案”使用麻烦的旧日期时间类(现已遗留),由java.time类取代。

您具有仅日期的值,因此请使用仅日期的类。该LocalDate级表示没有时间一天和不同时区的日期,唯一的价值。

String input = "January 08, 2017";
Locale l = Locale.US ;
DateTimeFormatter f = DateTimeFormatter.ofPattern( "MMMM dd, uuuu" , l );
LocalDate ld = LocalDate.parse( input , f );
Run Code Online (Sandbox Code Playgroud)

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

我强烈建议使用扩展格式以提高可读性。但是,如果您坚持使用基本格式,则该格式化程序会在DateTimeFormatter名为的类中预定义为常量BASIC_ISO_DATE

String output = ld.format( DateTimeFormatter.BASIC_ISO_DATE );
Run Code Online (Sandbox Code Playgroud)

参见IdeOne.com实时运行代码

ld.toString():2017-01-08

输出:20170108


关于java.time

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

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

要了解更多信息,请参见Oracle教程。并在Stack Overflow中搜索许多示例和说明。规格为JSR 310

在哪里获取java.time类?

ThreeTen-额外项目与其他类扩展java.time。该项目为将来可能在java.time中添加内容提供了一个试验场。你可能在这里找到一些有用的类,比如IntervalYearWeekYearQuarter,和更多

  • @JoachimSauer 所以在这个答案的新编辑中指出;感谢您的评论。我确信所有 Android 开发人员都会感谢您在 *java.time* 功能方面所做的工作。 (2认同)

Sun*_*nil 5

尝试这个

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

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;
}
Run Code Online (Sandbox Code Playgroud)