19

我是 Java 新手。Postgres db 包含日期格式为yyyy-MM-dd. 我需要转换为dd-MM-yyyy.

我试过这个,但错误的结果是显示

   public static void main(String[] args) throws ParseException {

    String strDate = "2013-02-21";
      DateFormat formatter = new SimpleDateFormat("dd-MM-yyyy");
      Date da = (Date)formatter.parse(strDate);
      System.out.println("==Date is ==" + da);
      String strDateTime = formatter.format(da);

      System.out.println("==String date is : " + strDateTime);
}
4

8 回答 8

55
SimpleDateFormat format1 = new SimpleDateFormat("yyyy-MM-dd");
SimpleDateFormat format2 = new SimpleDateFormat("dd-MM-yyyy");
Date date = format1.parse("2013-02-21");
System.out.println(format2.format(date));
于 2013-02-21T10:12:17.453 回答
11

您需要使用两个DateFormat实例。一个包含输入字符串的格式,另一个包含输出字符串的所需格式。

public static void main(String[] args) throws ParseException {

    String strDate = "2013-02-21";

    DateFormat inputFormatter = new SimpleDateFormat("yyyy-MM-dd");
    Date da = (Date)inputFormatter.parse(strDate);
    System.out.println("==Date is ==" + da);

    DateFormat outputFormatter = new SimpleDateFormat("dd-MM-yyyy");
    String strDateTime = outputFormatter.format(da);
    System.out.println("==String date is : " + strDateTime);
}
于 2013-02-21T10:10:56.317 回答
5

参考这些格式Java 日期格式文档

日期时间格式

试试这个代码:

String myDate= "2013-02-21";
DateFormat iFormatter = new SimpleDateFormat("yyyy-MM-dd");
DateFormat oFormatter = new SimpleDateFormat("dd-MM-yyyy");
String strDateTime = oFormatter.format(iFormatter.parse(myDate));
于 2013-02-21T10:19:43.713 回答
2

您需要一种格式来解析当前状态和一种格式来生成所需的输出。

String strDate  = "2013-02-21";
DateFormat to   = new SimpleDateFormat("dd-MM-yyyy"); // wanted format
DateFormat from = new SimpleDateFormat("yyyy-MM-dd"); // current format
System.out.println(to.format(from.parse(strDate)));
于 2013-02-21T10:13:25.920 回答
2

尝试以下实用功能。

// 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 "";
        }

}

// call function with required parameter arguments
String resultDate = convertStringDateToAnotherStringDate("2017-06-22", "yyyy-MM-dd", "dd-MM-yyyy")
System.out.println(resultDate);

结果: 22-06-2017

于 2017-06-22T14:59:12.320 回答
0

您正在使用相同的格式化程序来处理不同的格式。

您需要提供两个格式化程序new SimpleDateFormat("dd-MM-yyyy");来转换2013-02-21为日期对象并将日期对象new SimpleDateFormat("dd-MM-yyyy");格式化为字符串21-02-2013

于 2013-02-21T10:13:47.677 回答
0

首先,您不应该String从 Postgres 数据库中获取日期。您应该将其作为表示日期的类型的对象来获取。

其次,虽然在 2013 年使用DateSimpleDateFormat普遍合理,但日子已经过去,新的更好的日期和时间类已经问世并普遍使用。恕我直言,没有人应该再使用旧课程了,我认为它们早已过时。

要从您的数据库中获取LocalDate对象:ResultSet

    LocalDate da = yourResultSet.getObject(3, LocalDate.class);

(我假设日期在查询的第 3 列中)。

将其格式化为dd-MM-yyyy

    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MM-uuuu");
    String strDateTime = da.format(formatter);
    System.out.println("==String date is : " + strDateTime);

这将给出类似的输出

==String date is : 21-02-2013

最后,如果您有问题中的字符串并希望将其重新格式化为所需的格式:

    String strDate = "2013-02-21";      
    LocalDate da = LocalDate.parse(strDate);
    System.out.println("==Date is ==" + da);

这打印

==Date is ==2013-02-21

我正在利用字符串匹配 ISO 8601 标准日期格式这一事实,这是现代日期和时间类的默认格式。所以在这种情况下,我们不需要一个显式的格式化程序来解析,就像我们解析其他格式一样。

格式化为您想要的格式就像以前一样发生。

旧类问题的一个例子

在我的计算机上,问题中代码的输出是

==Date is ==Tue Aug 06 00:00:00 CET 26
==String date is : 06-08-0026

您显然得到了错误的结果,并且您不知道出了什么问题。问题是您正在使用您打算用于新字符串的格式化程序解析您2013-02-21数据库日期字符串dd-MM-yyyy. 所以它被解析为公元 2013 年 2 月 21 日。2月不是2013天吗?使用默认设置没有问题SimpleDateFormat,它只是继续计算接下来的几个月和几年的天数,并在五年半后的 8 月 6 日结束,但仍处于历史的早期阶段。

如果我们尝试对现代类进行类似操作:

    LocalDate.parse(strDate, formatter);

——我们得到java.time.format.DateTimeParseException: Text '2013-02-21' could not be parsed at index 2。这是因为格式化程序指示了两位数的日期,所以当解析两位数后输入字符串中有更多位时,这是一个错误,并因此报告。我认为这种行为更正确,更有帮助。

于 2017-06-30T15:52:19.357 回答
0

您需要使用SimpleDateFormat实例并传递您喜欢的日期模式。

当前模式:yyyy-MM-dd

需要的模式:dd-MM-yyyy

现在尝试以下。它产生所需的日期格式模式。

public class App {
    public static void main(String[] args) {
        SimpleDateFormat format1 = new SimpleDateFormat("yyyy-MM-dd");
        SimpleDateFormat format2 = new SimpleDateFormat("dd-MM-yyyy");
        Date date = null;
        try {
            date = format1.parse("2013-02-21");
            System.out.println(format1.format(date)); //current format: 2013-02-21
        } catch (ParseException e) {
            e.printStackTrace();
        }
        System.out.println(format2.format(date)); //the format that is needed : 21-02-2013
    }
}
于 2018-07-07T07:48:23.640 回答