在java中将数字dMMyy转换为日期

在java中将数字dMMyy转换为日期,java,date,Java,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

我有来自数据库的日期作为类型号。 我必须将其转换为日期,比如如果我在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

格式字符串中的
dd
表示有两位数字表示天数值。在字符串中,删除了前导的
0
,因此日值现在仅为一位数字。因此,正确的格式字符串将是
dMMyy
,这将为您提供正确的日期

更好的解决方案是确保不会丢失前导的
0
,方法是不将日期视为整数,或者用前导的零预先填充数字

无论如何,这种情况下的快速解决方案是:

String strDate = "0" + String.valueOf(70311);
Date date = new SimpleDateFormat("ddMMyy").parse(strDate);

有关更多详细信息,请参阅文档


编辑

以正确格式获取字符串的更可靠方法(在左侧填充
0
s)是使用
String.format
,如下所示:

String.format("%06d", num);
正如评论中指出的,这确保了仅在需要时添加
0

String strDate = String.format("%06d", 70311);
Date date = new SimpleDateFormat("ddMMyy").parse(strDate);

格式字符串中的
dd
表示有两位数字表示天数的值。在字符串中,删除了前导的
0
,因此日值现在仅为一位数字。因此,正确的格式字符串将是
dMMyy
,这将为您提供正确的日期

更好的解决方案是确保不会丢失前导的
0
,方法是不将日期视为整数,或者用前导的零预先填充数字

无论如何,这种情况下的快速解决方案是:

String strDate = "0" + String.valueOf(70311);
Date date = new SimpleDateFormat("ddMMyy").parse(strDate);

有关更多详细信息,请参阅文档


编辑

以正确格式获取字符串的更可靠方法(在左侧填充
0
s)是使用
String.format
,如下所示:

String.format("%06d", num);
正如评论中指出的,这确保了仅在需要时添加
0

String strDate = String.format("%06d", 70311);
Date date = new SimpleDateFormat("ddMMyy").parse(strDate);
这个类很好,但是使用了过时的类

LocalDate
阅读他的解释,但使用现代java.time类

该类表示一个仅限日期的值,不包含一天中的时间和时区

int inputNumber = 70311 ;
String inputModified = String.format( "%06d", inputNumber ) ;

DateTimeFormatter f = DateTimeFormatter.ofPattern( "ddMMuu" ) ;
LocalDate ld = LocalDate.parse( inputModified , f );
顺便说一下,这种将日期值压缩成整数的想法很糟糕。序列化日期时间数据时,请使用标准格式。日期为2011年3月7日的
2011-03-07
。在生成和解析字符串时,java.time类默认使用这些格式。并始终使用4位数字,因为歧义和阅读困难不值得两位数字的间隔


关于java.time 该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,例如,&

该项目现已启动,建议迁移到java.time

要了解更多信息,请参阅。并搜索堆栈溢出以获得许多示例和解释。规格是

从哪里获得java.time类

  • 后来
    • 内置的
    • 标准JavaAPI的一部分,带有捆绑实现
    • Java9添加了一些次要功能和修复
    • 大部分java.time功能都在中向后移植到Java6和Java7
    • 该项目专门针对Android采用了Three Ten Backport(如上所述)
该项目使用其他类扩展了java.time。这个项目是java.time将来可能添加的一个试验场。您可以在这里找到一些有用的类,如、、和。

很好,但使用的是过时的类

LocalDate
阅读他的解释,但使用现代java.time类

该类表示一个仅限日期的值,不包含一天中的时间和时区

int inputNumber = 70311 ;
String inputModified = String.format( "%06d", inputNumber ) ;

DateTimeFormatter f = DateTimeFormatter.ofPattern( "ddMMuu" ) ;
LocalDate ld = LocalDate.parse( inputModified , f );
顺便说一下,这种将日期值压缩成整数的想法很糟糕。序列化日期时间数据时,请使用标准格式。日期为2011年3月7日的
2011-03-07
。在生成和解析字符串时,java.time类默认使用这些格式。并始终使用4位数字,因为歧义和阅读困难不值得两位数字的间隔


关于java.time 该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,例如,&

该项目现已启动,建议迁移到java.time

要了解更多信息,请参阅。并搜索堆栈溢出以获得许多示例和解释。规格是

从哪里获得java.time类

  • 后来
    • 内置的
    • 标准JavaAPI的一部分,带有捆绑实现
    • Java9添加了一些次要功能和修复
    • 大部分java.time功能都在中向后移植到Java6和Java7
    • 该项目专门针对Android采用了Three Ten Backport(如上所述)

该项目使用其他类扩展了java.time。这个项目是java.time将来可能添加的一个试验场。您可能会在这里找到一些有用的类,例如、、和。

在前面添加零是一个很好的解决方案,但我还建议检查字符串长度是否有6位数字。当你编写代码时,你应该处理所有的边缘情况。@deadfish我想这是对OP的注释吧?我同意最终的解决方案应该处理任何边缘情况,尽管对该代码的任何进一步改进都可能超出t