将日期字符串转换为不同的格式

24

我有一个包含日期的字符串,格式为YYYY-MM-DD

您如何建议我以最佳方式将其转换为格式为DD-MM-YYYY的字符串?

以下是我天真地实现它的方式:

import java.util.*;
public class test {
    public static void main(String[] args) {
         String date = (String) args[0]; 
         System.out.println(date); //outputs: YYYY-MM-DD
         System.out.println(doConvert(date)); //outputs: DD-MM-YYYY
    }

    public static String doConvert(String d) {
         String dateRev = "";
         String[] dateArr = d.split("-");
         for(int i=dateArr.length-1 ; i>=0  ; i--) {
             if(i!=dateArr.length-1)
                dateRev += "-";
             dateRev += dateArr[i];
         }
    return dateRev;
    }
}

但是有没有其他更优雅和有效的方法呢?即使用一些内置功能?我在快速搜索API时没有找到,有人知道另一种方法吗?


我已经创建了一个简单的方法来实现这个。请参考https://dev59.com/l1sV5IYBdhLWcg3wrAZJ#40042733 - Rahul Sharma
5个回答

45

使用 java.util.DateFormat

DateFormat fromFormat = new SimpleDateFormat("yyyy-MM-dd");
fromFormat.setLenient(false);
DateFormat toFormat = new SimpleDateFormat("dd-MM-yyyy");
toFormat.setLenient(false);
String dateStr = "2011-07-09";
Date date = fromFormat.parse(dateStr);
System.out.println(toFormat.format(date));

肯定更优雅。但你也会认为它更有效吗?这是一个Android应用程序。并且唯一可以使用的字符串格式是提到的那些。 - lobner
@lobner: 如果你想要存储日期,最好将其存储为一个日期对象而不是一个字符串。 - Hovercraft Full Of Eels
@Hovercraft:我已经被说服了 :) 使用Settings.System.html#DATE_FORMAT,我可以使用用户喜欢的日期格式。因此,我创建了日期对象,一切都很好。 - lobner

5
这里是现代答案。
private static DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MM-uuuu");

public static String doConvert(String d) {
    return LocalDate.parse(d).format(formatter);
}

我们可以用这个来做一些事情,例如:

    System.out.println(doConvert("2017-06-30"));

这段代码会打印出来。
30-06-2017

我正在利用您所拥有的格式,YYYY-MM-DD符合ISO 8601标准,这是现代Java日期和时间类本地“理解”的标准,因此我们不需要显式格式化程序进行解析,只需要一个用于格式化的程序。

当这个问题在2011年被提出时,SimpleDateFormat也是我会给出的答案。新的日期和时间API在2014年初推出了Java 8,并在ThreeTen-Backport项目中向Java 6和7回溯。对于Android,请参见ThreeTenABP项目。因此,如今我真的看不出仍然使用SimpleDateFormatDate的任何借口。新的类更加友好且易于使用。


4
最好使用一个 SimpleDateFormat(API)对象来将字符串转换为日期对象。然后,您可以通过另一个 SimpleDateFormat 对象将其转换为任何您希望的字符串表示形式,从而使您具有巨大的灵活性。

2

如果您不需要将字符串转换为日期或者反过来,也不需要处理无效日期等问题,那么字符串操作是最简单和高效的方法。但是与使用DateFormat相比,它的可读性和可维护性要差得多。

String dateInNewFormat = dateInOldFormat.substring(8) 
                         + dateInOldFormat.substring(4, 8) 
                         + dateInOldFormat.substring(0, 4)

这实际上完美地解决了我的特定问题,就像我想要的那样。简单而优雅。正如我之前提到的,我不需要任何其他格式,所以这是最佳选择 :) - lobner
2
@lobner:我不太同意。一旦你需要以不同的格式呈现数据,你就必须重新编写所有代码。如果你想要保存日期,你应该将其保存为字符串吗?使用哪种格式?通常来说,使用Date对象更具灵活性和普遍性。这个答案很好,但更适合于快速简单的解决方案。 - Hovercraft Full Of Eels
@Hovercraft:我改口了。实际上,我只需要“快速而简单”的方法,但在此过程中,我改变了应用程序的责任和要求。 - lobner

1
import java.util.DateFormat;   

// Convert String Date To Another String Date
public String convertStringDateToAnotherStringDate(String stringdate, String stringdateformat, String returndateformat){        

        try {
            Date date = new SimpleDateFormat(stringdateformat).parse(stringdate);
            String returndate = new SimpleDateFormat(returndateformat).format(date);
            return returndate;
        } catch (ParseException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            return "";
        }

}

//-------
String resultDate = convertStringDateToAnotherStringDate("1997-01-20", "yyyy-MM-dd", "MM/dd/yyyy")
System.out.println(resultDate);

结果(日期字符串):01/20/1997

1
虽然在2011年提出这个问题时我会同意使用SimpleDateFormat,但现在它已经过时了,使用现代的Java日期和时间API要好得多。 - Ole V.V.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接