日历日期不起作用

时间:2017-11-07 21:26:05

标签: java datetime simpledateformat java.util.calendar

Calendar cal_aux = GregorianCalendar.getInstance();
System.out.println("setea calendar:" + Integer.parseInt(fecha.substring(0, 4))
        + Integer.parseInt(fecha.substring(5, 7))
        + Integer.parseInt(fecha.substring(8, 10)));
cal_aux.set(Integer.parseInt(fecha.substring(0, 4)),
        Integer.parseInt(fecha.substring(5, 7)),
        Integer.parseInt(fecha.substring(8, 10)));
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println("muestra calendar:" + sdf.format(cal_aux.getTime()));

控制台:

setea calendar:20171231
muestra calendar:2018-01-31 18:12:50

为什么日期显示不好? 任何解决方案?

2 个答案:

答案 0 :(得分:1)

避免使用java.time类取代的旧版日期时间类。有问题的遗留类有许多设计缺陷。一个这样的错误是将月数计为0-11而不是1-12。这种疯狂的计数打破了你的代码。

不要将日期时间值作为字符串进行操作。使用对象。

对于该日期值,请使用LocalDate

LocalDate ld = LocalDate.parse( "2017-12-31" )  ;  // Or LocalDate.now() for today's date.

使用DateTimeFormatter生成字符串。

String output = ld.format( DateTimeFormatter.BASIC_ISO_DATE ) ;
  

20171231

如果需要,指定一个时间。

LocalTime lt = LocalTime.of( 6 , 15 ) ;
LocalDateTime ltd = LocalDateTime.of( ld , lt ) ;

如果您想要实际时刻,时间线上的特定点,请应用时区。

ZoneId z = ZoneId.of( "Africa/Casablanca" ) ;
ZonedDateTime zdt = ldt.atZone( z ) ;

答案 1 :(得分:0)

首先,您设置了错误的日期,因为月份范围是0-11。当您在月份字段中设置12时,是2018年1月而不是2017年12月。

其次,您可以简化程序,将输入字符串解析为格式化日期,并解析此日期以输出格式化字符串。这是一个例子:

String input = "20171231";
SimpleDateFormat inputFormat = new SimpleDateFormat("yyyyMMdd");
SimpleDateFormat outputFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

try {
    System.out.println(outputFormat.format(inputFormat.parse(input)));
} catch (ParseException e) {
    // Log error
}