错误输出将日期格式从YYYYMMDD转换为dd-mm-yyyy

时间:2018-02-24 22:51:57

标签: java string date-format

我在日期的java转换上遇到了问题。 我输入了一个字符串,YYYYMMDD,转换为long,并通过执行代码输出错误

try {
           //Current date to dd-mm-yyyy
            Date currentDate = new Date(20161205); //or 
            DateFormat df = new SimpleDateFormat("dd-mm-yyyy");
            String strCurrentDate = df.format(currentDate);
            System.out.println("Date is " + strCurrentDate);
        } catch (Exception e) {
            System.out.println("Exception :" + e);
        }

输出为:01-49-1970 为什么??我该如何解决问题

4 个答案:

答案 0 :(得分:1)

解决方案:

 Date currentDate = new Date(116,11,05);

说明:

您将单个数字作为Date构造函数的参数。如果您查看此类in Java API documentation here的可用构造函数列表,您会注意到将选择以long作为参数的构造函数。正如文件所述:

Date​(long date) - 分配一个Date对象并对其进行初始化,以表示自标准基准时间称为“epoch”以来的指定毫秒数,即1970年1月1日00:00:00 GMT

而不是那样,如果你真的需要使用java.util.date包(现在java.time被认为是正确的选择),请考虑使用另一个构造函数:Date​(int year, int month, int date)。在这种情况下,您应该将以下数字作为参数传递:

Date currentDate = new Date(116,11,05);

这是因为:

年 - 减去1900年。

月 - 0-11之间的月份。

日期 - 1-31之间的某一天。

顺便说一句,考虑使用java.time包而不是java.util,因为现在不推荐使用java.util.Date。

答案 1 :(得分:1)

你是以错误的方式做到了 如果您想将此格式yyyyMMdd中的日期更改为此格式yyyy-MM-dd

你必须稍微改变你的代码

try {
//Current date to dd-mm-yyyy

DateFormat fromFormate = new SimpleDateFormat("yyyyMMdd");
DateFormat toFormate = new SimpleDateFormat("yyyy-MM-dd");

String dateToFormate = "20161205"; //or 
Date d=fromFormate.parse(dateToFormate);

System.out.println("Date is " + toFormat.formate(d));
} catch (Exception e) {
System.out.println("Exception :" + e);
}

答案 2 :(得分:1)

TL;博士

LocalDate.parse(
    "20161205", 
    DateTimeFormatter.BASIC_ISO_DATE
).format(
    DateTimeFormatter.ofPattern("dd-MM-uuuu")
)
  

2016年5月12日

为什么01-49-1970?

我无法重现您的确切输出,因此可以解释大部分内容,而不是全部。可能你已经混淆了几个测试例子而没有从new Date(20161205)获得01-49-1970。在我的电脑上,我得到Date is 01-36-1970。这太糟了。

正如其他人所指出的那样,new Date(20161205)为您提供1970年1月1日00:00 UTC世纪后的一个超过20 000秒的时间点。在UTC中,时间是1月1日5:36:01.205(AM)。您所在时区的时间可能不同。有些时区的日期仍然是1969年12月31日。

但这似乎并不能解释你是如何在1970年的第49个月或者在第36个月获得产出的。这是因为您在格式模式字符串中使用了小写mmmm是一小时。大写MM是月份。所以36我得到了5:36:01的分钟。分钟不一样的时区;但我找不到这个时刻49分钟的时区,所以你的确切报告输出我无法解释。

如何解决问题?

正如其他人所说,使用现代Java日期和时间API java.time。与它合作非常好。

    LocalDate currentDate = LocalDate.of(2016, Month.DECEMBER, 5);

或者来自字符串:

    LocalDate currentDate 
            = LocalDate.parse("20161205", DateTimeFormatter.BASIC_ISO_DATE);

格式化为您想要的输出:

    DateTimeFormatter dtf = DateTimeFormatter.ofPattern("dd-MM-uuuu");
    String strCurrentDate = currentDate.format(dtf);
    System.out.println("Date is " + strCurrentDate);

打印

  

日期是2016年12月5日

作为奖励,如果您碰巧在上面的格式模式字符串中使用mm而非MM,则java.time会通过异常通知您。

链接: Oracle Tutorial: Date Time解释如何使用java.time。

答案 3 :(得分:0)

就像@ oceano22所说,有更新/更好的日期/时间套餐可用。也就是说,发生这种情况的原因是因为当你调用new Date(20161205)时,日期构造函数所采用的参数不是yyyyMMdd。根据javadoc ..."分配一个Date对象并对其进行初始化,以表示自标准基准时间(" epoch",即1970年1月1日,00)以来指定的毫秒数:格林威治标准时间00:00。"

所以你真的在Unix时代(1970年1月1日)之后的2000万毫秒创建了一个日期。

我已经尝试使用您定义的SimpleDateFormat df将2016年12月5日纳入日期使用df.parse(" 05-12-2016")。 / p>

您也可能希望以您的日期格式获得月份资本M,例如" DD-MM-YYYY"因为小写的m是几分钟。