java - 如何将格式日期“MMddhhmmss”转换为“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 点)都不会改变?
解决方案
不要在程序中将日期和时间作为字符串处理。处理并将它们存储为适当的日期时间对象。当您接受字符串输入时,将其解析为日期时间对象。只有当您需要提供字符串输出时,才将您的日期时间对象格式化为适当的字符串。
java.time
我认为使用现代 Java 日期和时间 API java.time,您的解析会变得更加清晰。我知道字符串中给出的小时是一天中的小时,所以 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);
今天运行时的输出:
2020-07-17T12:55:17
格式化输出
我向您展示了将输出格式化为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 的 AM 或 PM 中的小时。这适用于老式SimpleDateFormat
和现代DateTimeFormatter
. 您没有告诉格式化程序您想要上午还是下午。在这种情况下SimpleDateFormat
假设上午,这就是为什么你得到一个时间 og 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 个月。
链接
推荐阅读
- google-cloud-platform - 如何在谷歌云上托管“多页”的静态网站
- powerbi - 对功率 BI 矩阵进行排序以保持年份升序
- python - 脚本中断,因为列表中不存在索引
- docker - Jenkins构建如何获取docker镜像
- php - 在 Laravel 7/8 中获取当前 URL 的一部分
- lua - 如何调用复制存储中的函数
- html - 调整窗口大小时文本对齐过渡
- graph - 在 CPLEX 中有向图中依赖于集合/子集的弧的初始化
- python - 将程序转换为 Python 可执行文件后,不会创建文件夹
- facebook - 如何从 Facebook 生成 JWT 类型的访问令牌