Java SimpleDataFormat未检测月份
我在Java中使用SimpleDataFormat,出于某种原因,它没有检测到月份。这是我的密码:Java SimpleDataFormat未检测月份,java,simpledateformat,date-format,Java,Simpledateformat,Date Format,我在Java中使用SimpleDataFormat,出于某种原因,它没有检测到月份。这是我的密码: /** * Takes a date/time stamp which looks like yyyyMMDDhhmmss on converts it to * yyyy-MM-DDThh:mm:ssZ * * @param timestamp * @return */ public static String Con
/**
* Takes a date/time stamp which looks like yyyyMMDDhhmmss on converts it to
* yyyy-MM-DDThh:mm:ssZ
*
* @param timestamp
* @return
*/
public static String ConvertDate(String timestamp) {
if (timestamp == null || timestamp.length() < 14)
return null;
String timeString = null;
System.out.println(timestamp);
DateFormat outputFormat = new SimpleDateFormat("YYYY-MM-DD'T'hh:mm:ss'Z'");
DateFormat inputFormat = new SimpleDateFormat("yyyyMMDDhhmmss");
try{
Date date = inputFormat.parse(timestamp);
timeString = outputFormat.format(date);
}
catch(Exception e){}
return timeString;
}
/**
*将其转换为上的日期/时间戳(看起来像yyyyMMDDhhmmss)
*yyyy-MM-DDThh:MM:ssZ
*
*@param时间戳
*@返回
*/
公共静态字符串转换日期(字符串时间戳){
if(timestamp==null | | timestamp.length()<14)
返回null;
字符串timeString=null;
System.out.println(时间戳);
DateFormat outputFormat=新的SimpleDataFormat(“YYYY-MM-DD'T'hh:MM:ss'Z'”;
DateFormat inputFormat=新的SimpleDataFormat(“yyyyMMDDhhmmss”);
试一试{
日期=inputFormat.parse(时间戳);
timeString=outputFormat.format(日期);
}
捕获(例外e){}
返回时间串;
}
调用此方法:ConvertDate(“2019080312244”)
返回以下内容:2019-01-03T12:24:24Z
,而我想返回:2019-08-03T12:24:24Z
我的输出格式有问题吗?您使用了错误的日期格式字符串:
DD
(年中的天)而不是DD
(月中的天)。将两个SimpleDataFormat
实例都更改为使用dd
:
DateFormat inputFormat = new SimpleDateFormat("yyyyMMddhhmmss");
DateFormat outputFormat = new SimpleDateFormat("YYYY-MM-dd'T'hh:mm:ss'Z'");
因此,您得到的结果是错误的。正如大家指出的那样,您的格式化程序
yyymmddhhmmss
是错误的,因此请使用有效的格式创建DateTimeFormatter
DateTimeFormatter inputFormat = DateTimeFormatter.ofPattern("yyyyMMddHHmmss");
通过使用java-8日期时间API将其解析为LocalDateTime
,然后使用ZonedDateTime
String dateString = "20190803122424";
LocalDateTime localDateTime = LocalDateTime.parse(dateString,inputFormat);
ZonedDateTime outputDateTime = localDateTime.atZone(ZoneOffset.UTC);
然后您可以将其转换为OffsetDateTime
OffsetDateTime outputDateTime = localDateTime.atOffset(ZoneOffset.UTC);
如果您特别想要ZoneDateTime
String dateString = "20190803122424";
LocalDateTime localDateTime = LocalDateTime.parse(dateString,inputFormat);
ZonedDateTime outputDateTime = localDateTime.atZone(ZoneOffset.UTC);
您是否尝试过将“yyyymmddhhmms”更改为“yyymmddhhmms”(小写D,大写H)?值得注意的是,在这种情况下,调用
setLenient(false)
会导致parse
引发异常。我建议您不要使用SimpleDateFormat
和Date
。这些类设计得很糟糕,而且早已过时,其中前者尤其令人讨厌。相反,请使用来自的OffsetDateTime
和DateTimeFormatter
。不仅输入格式,输出格式模式字符串也有两个模式字母大小写错误的实例。此外,带引号的'Z'
肯定会给你带来不正确的结果。给魔鬼应得的报应,你做得很快,所以在正确的月份返回,但却把当天搞砸了:2019-08-215T12:24:24Z@Smi28这是输出格式化程序的问题,而不是日期分析器的问题。您还在输出格式化程序中使用了DD
。在这两种情况下,您都需要dd
。谢谢我更新了使用OffsetDateTime
@basilbourque谢谢您的想法,但不必相信我。我建议将您的ZonedDateTime
行完全替换为OffsetDateTime
。此外,为了清晰起见,我建议将LocalDateTime
对象拆分为自己的行。所以有两行:LocalDateTime LocalDateTime=…
和OffsetDateTime OffsetDateTime=…
。