我的日期来自数据库,类型为Number。 我必须将它转换为Date,就好像我在db中有070311日期,然后从db中删除我在java中获得70311。 丢失了0因为它的号码。 因此,我将此数字转换为字符串,然后格式化为日期,但未按要求提供07/03/11。
String strDate = String.valueOf(70311);
Date date = new SimpleDateFormat("ddMMyy").parse(str);
输出日期我将于9月8日星期六00:00:00 IST 3 这是08/09/0003,但它假设像07/03/11。
答案 0 :(得分:3)
格式字符串中的dd
表示有两个数字代表天数。在您的字符串中,您删除了前导0
,因此日值现在只有一位数。因此,正确的格式字符串将为dMMyy
,这将为您提供正确的日期。
更好的解决方案是确保您不会丢失前导0
,但不要将日期视为整数,或者使用前导零填充数字。
无论如何,在这种情况下的快速解决方案是:
String strDate = "0" + String.valueOf(70311);
Date date = new SimpleDateFormat("ddMMyy").parse(strDate);
或
String strDate = String.valueOf(70311);
Date date = new SimpleDateFormat("dMMyy").parse(strDate);
有关详细信息,请参阅SimpleDateFormat
文档。
修改的
以正确格式获取字符串的更可靠方法(在左侧填充0
)是使用String.format
,如下所示:
String.format("%06d", num);
正如评论中所指出的,这可确保仅在需要时添加0
:
String strDate = String.format("%06d", 70311);
Date date = new SimpleDateFormat("ddMMyy").parse(strDate);
答案 1 :(得分:1)
Answer by nbrooks很好,但使用的是过时的类。
LocalDate
阅读他的解释,但使用现代的java.time类。
LocalDate
类表示没有时间且没有时区的仅限日期的值。
int inputNumber = 70311 ;
String inputModified = String.format( "%06d", inputNumber ) ;
DateTimeFormatter f = DateTimeFormatter.ofPattern( "ddMMuu" ) ;
LocalDate ld = LocalDate.parse( inputModified , f );
顺便说一下,将日期值压缩为整数的想法是可怕的。序列化日期时间数据时,请使用标准ISO 8601格式。对于2011年3月7日的日期,这将是2011-03-07
。生成和解析字符串时,默认情况下会在java.time类中使用这些格式。并且总是使用4位数字,因为阅读的模糊性和难度不值得以两位数保存的间距。
java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,.Calendar
和& java.text.SimpleDateFormat
现在位于Joda-Time的maintenance mode项目建议迁移到java.time。
要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310。
从哪里获取java.time类?
ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如Interval
,YearWeek
,YearQuarter
和more。