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

我在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 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=…