![](/img/trans.png)
[英]How to change date and time format from“yyyy-MM-dd HH:mm:ss” to “h:mm a”?
[英]How to convert format date “MMddhhmmss” to “yyyy-MM-dd HH:mm:ss”?
如何将日历日期转换为 yyyy-MM-dd HH:mm:ss 格式。
protected String paymentDatetime (String transmissionDateTime){
long transactionDateTime = System.currentTimeMillis();
Date now = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
try {
SimpleDateFormat df = new SimpleDateFormat("MMddhhmmss");
Calendar nowDate = Calendar.getInstance();
nowDate.setTime(now);
Calendar transmissionDate = Calendar.getInstance();
transmissionDate.setTime(df.parse(transmissionDateTime));
transmissionDate.set(Calendar.YEAR, nowDate.get(Calendar.YEAR));
transactionDateTime = transmissionDate.getTime().getTime();
} catch (ParseException e) {
LOGGER.error("cannot parse transmission date time : " + transmissionDateTime);
}
return sdf.format(transactionDateTime);
}
我想得到String transmissionDateTime抛出的值,但实际上当我抛出 value = 1707 1255 17 (in AM) 时,将转换为“2020-07-17 00:55:17”。 如何转换以使 AM 和 PM 每隔 12.00 或 00.00(12 点)都不会改变?
不要在程序中将日期和时间作为字符串处理。 处理并将它们存储为适当的日期时间对象。 当您输入字符串时,将其解析为日期时间 object。 仅当您需要提供字符串 output 时,将您的日期时间 object 格式化为适当的字符串。
我认为使用 java.time,现代 Java 日期和时间 API,您的解析会变得更加清晰。 我知道字符串中给出的小时是一天中的小时,所以 00 表示午夜 12 点,12 表示中午 12 点。
Year thisYear = Year.now(ZoneId.systemDefault());
DateTimeFormatter inputFormatter = new DateTimeFormatterBuilder()
.appendPattern("ddMMHHmmss")
.parseDefaulting(ChronoField.YEAR, thisYear.getValue())
.toFormatter();
String transmissionDateTimeString = "1707125517";
LocalDateTime transmissionDateTime
= LocalDateTime.parse(transmissionDateTimeString, inputFormatter);
System.out.println(transmissionDateTime);
Output 今天运行时:
2020-07-17T12:55:17
格式化 output
我向您展示了将 output 格式化为2020-07-17 12:55:17
的两个选项。
T
替换为空格使用格式化程序:
DateTimeFormatter outputFormatter = DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm:ss");
String output = transmissionDateTime.format(outputFormatter);
只需更换T
:
String output = transmissionDateTime.toString().replace('T', ' ');
格式模式字符串中的小写hh
是上午或下午从 01 到 12 的小时。这适用于老式的SimpleDateFormat
和现代的DateTimeFormatter
。 您没有告诉格式化程序您想要上午还是下午。 在这种情况下, SimpleDateFormat
假定 AM,这就是为什么您的时间为 00:55:17。 大写HH
表示一天中从 00 到 23 的小时。
此外,您似乎不小心在格式模式中交换了月份和日期以进行解析MMddhhmmss
。 当我调用你的方法时,我得到了2020-05-07 00:55:17
。 月份和日期是错误的。 您的df
1707125517
解析为Fri May 07 00:55:17 CET 1971
。 一年中没有第 17 个月,但SimpleDateFormat
令人困惑地推断,因此 1970 年的第 17 个月变成了 1971 年的第 5 个月。
Calendar
和SimpleDateFormat
是旧类,不再推荐。
使用java.time package 中的LocalDateTime和DateTimeFormatter类。
DateTimeFormatter from = DateTimeFormatter.ofPattern("MMddhhmmss");
DateTimeFormatter to12Hour = DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm:ss a");
DateTimeFormatter to24Hour = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
LocalDateTime ldt = LocalDateTime.now();
System.out.println(ldt.format(from));
System.out.println(ldt.format(to12Hour));
System.out.println(ldt.format(to24Hour));
印刷
0716082236
2020-07-16 08:22:36 PM
2020-07-16 20:22:36
正如评论已经涵盖的那样: MMddhhmmss
应该是使用大写HH
的MMddHHmmss
。
格式MMddHHmmss
的字符串"1707125517"
表示MM = 17
和dd = 07
。 不带年份解析时,年份默认为 1970 年,1970 年的第 17 个月解析为 1971 年的第5个月,这就是问题代码导致2020-05-07
(第 5 个月第 7 天)的原因。
您确定 Month = 17 的输入是您要解析的内容,并且格式模式是您想要的吗? 似乎月份和日期是颠倒的,因为你说"will be convert to "2020-07-17 00:55:17"" ,其中月份是 7 天是 17,所以也许你应该尝试格式化ddMMHHmmss
。
问题中的方法可以缩短为仅使用一个Calendar
object 而不是两个:
protected static String paymentDatetime(String dateTime) {
Calendar cal = Calendar.getInstance();
int year = cal.get(Calendar.YEAR);
try {
cal.setTime(new SimpleDateFormat("ddMMHHmmss").parse(dateTime));
} catch (ParseException e) {
throw new IllegalArgumentException("Invalid date string: " + dateTime, e);
}
cal.set(Calendar.YEAR, year);
return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(cal.getTime());
}
该方法也被更改为不忽略解析异常。
不应使用旧的过时Date
和SimpleDateFormat
类。 相反,使用较新的Java 8 时间 API类。
protected static String paymentDatetime(String dateTime) {
DateTimeFormatter in = new DateTimeFormatterBuilder()
.appendPattern("ddMMHHmmss")
.parseDefaulting(ChronoField.YEAR, Year.now().getValue())
.toFormatter();
DateTimeFormatter out = DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm:ss");
return LocalDateTime.parse(dateTime, in).format(out);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.