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
为什么日期显示不好? 任何解决方案?
答案 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
}