String req ="0229191315"
private static DateFormat dateFrmtGmt - new SimpleDateFormat ("EEE MMM d HH:mm:ss z yyyy", Locale.ENGLISH);
SimpleDateFormat sdf=new SimpleDateFormat( "MMddHHmmss");
cal.setTime(sdf.parse(gmtDate));
cal.set(Calendar.YEAR, Calendar.getInstance().get(Calendar.YEAR));
dateFrmtGmt.setTimeZone(TimeZone.getTimeZone("GMT"));
return cal;
String = "0229191315"
将于 2024 年 3 月 1 日周五 19:13:15 GMT 回归
而
string="0301191315"
将于 2024 年 3 月 1 日星期五 19:13:15 GMT 回归
对于所有日期,它都设置正确的日期和时间,但 2024 年 1 月 28 日和 29 日的设置值分别为 2 月 29 日和 3 月 1 日。
问题是您正在解析没有年份的输入。查看 SimpleDateFormat.parse() 方法的文档。
如果解析操作中未给出年份值,则解析的日期的年份值为 GregorianCalendar 的 1970。
由于 1970 年没有 2 月 29 日日期,因此解析返回 3 月 1 日。之后您设置实际年份,但日期仍保持解析时的样子。
在此答案中查看使用 java.time 包解决此问题的现代方法:https://stackoverflow.com/a/44470949/721855