我在日期的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 为什么??我该如何解决问题
答案 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)
LocalDate.parse(
"20161205",
DateTimeFormatter.BASIC_ISO_DATE
).format(
DateTimeFormatter.ofPattern("dd-MM-uuuu")
)
2016年5月12日
我无法重现您的确切输出,因此可以解释大部分内容,而不是全部。可能你已经混淆了几个测试例子而没有从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个月获得产出的。这是因为您在格式模式字符串中使用了小写mm
。 mm
是一小时。大写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是几分钟。