热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

java–SimpleDateFormatter.parse以不同于指定的格式提供输出

我需要获取UNIX时间戳(String),将其转换为特定格式的日期,并将其存储在DATETIME列中的MySQLDB中.这是我的一段代码(简化):Str

我需要获取UNIX时间戳(String),将其转换为特定格式的日期,并将其存储在DATETIME列中的MySQL DB中.

这是我的一段代码(简化):

String ep ="a1527069600";
Long epoch = Long.parseLong(ep.substring(1, ep.length()));
Date dt = new Date(epoch*1000L);
SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy hh:mm:ss a");
a");
sdf.setTimeZone(TimeZone.getTimeZone("Asia/Calcutta"));
System.out.println("SDF.Format - "+sdf.format(dt));
System.out.println("SDF.parse - "+sdf.parse(sdf.format(dt)));

控制台输出:

SDF.Format - 23/05/2018 03:30:00 PM

SDF.parse - Wed May 23 15:30:00 IST 2018

当我尝试在MySQL DB中推送此值时,它会抛出Invalid DateError.

只是混淆了为什么sdf.format和sdf.parse以不同的格式显示时间戳.

解决方法:

不要将日期作为字符串传递给MySQL数据库.传递日期对象更好,更简单,更安全.首先,它可以减轻您的格式和任何格式问题.最好,从java.time传递类的实例,即现代Java日期和时间API.在你的情况下,LocalDateTime会这样做.

String ep ="a1527069600";
long epoch = Long.parseLong(ep.substring(1));
Instant inst = Instant.ofEpochSecond(epoch);
LocalDateTime ldt = inst.atZone(ZoneId.of("Asia/Calcutta")).toLocalDateTime();
System.out.println(ldt);
PreparedStatement ps = myDatabaseConnection.prepareStatement(
"insert into my_table (my_date_time) values (?)");
ps.setObject(1, ldt);

获得的LocalDateTime是:

2018-05-23T15:30

我将epoch字符串的转换简化了一下.使用原始的小写long而不是Long对象.假设您的数据库值在此时区,我正在使用您的亚洲/加尔各答时区.正常建议是将数据库值保持为UTC,至少是否有可能在您的时区之外使用数据.如果您需要此功能,请使用此转换而不是上述转换:

LocalDateTime ldt = inst.atOffset(ZoneOffset.UTC).toLocalDateTime();

链接:Oracle tutorial: Date Time解释如何使用java.time.


推荐阅读
author-avatar
zhangwenkaii_555
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有