SimpleDateFormatter.parse提供与指定格式不同的输出

我需要获取UNIX时间戳(字符串),将其转换为特定格式的日期,并将其存储在DATETIME列的MySQL数据库中。

这是我的代码(简化):

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 <br>

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

当我尝试在MySQL数据库中推送此值时,它将引发Invalid DateError。

只是感到困惑,sdf.formatsdf.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

我简化了从纪元字符串的转换。使用基本的小写字母long而不是Long对象。我使用您的时区Asia /

Calcutta,假设您的数据库值在该时区中。通常的建议是将数据库值保留为UTC,至少在有可能在您所在时区之外使用数据的情况下。如果需要此,请使用此转换,而不是上面的转换:

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

Oracle教程:Date

Time说明如何使用java.time

以上是 SimpleDateFormatter.parse提供与指定格式不同的输出 的全部内容, 来源链接: utcz.com/qa/409228.html

回到顶部