当前位置: 首页 > 面试题库 >

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

侯善
2023-03-14
问题内容

我需要获取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



 类似资料:
  • 我们正在使用flight提供的搜索api,并准备转移到prod。但当我们搜索经济舱航班时,价格甚至不接近“amadeus.net”搜索引擎结果或TK(土耳其航空公司)网站价格。如果我们使用BUSINESS class作为参数,api结果更接近实际价格。我们如何解决这个问题? 示例查询为:(IST-CGN 5月25日经济和TK运营航班起飞16:05) /v2/购物/航班优惠?原始位置代码=IST a

  • 现在,我有下面的代码,它只是测试标准库中的< code>std::set_difference: 当我用Clang/GCC编译它时,我得到了输出: 更新我想实际使用的源代码案例(假设是我将要做的一些操作。因此,这些操作将按的顺序发生): 好吧,这看起来不错,它实际上对应于标准::set_difference,检查链接:但是当我选择MSVC时,我得到了不同的输出(检查链接:https://godbo

  • 我正在尝试实现ESAPI编码以防止在我的spring-mvc项目中进行XSS攻击。我的方法是在发送回响应中的输入之前,我将使用 ESAPI.encoder() 对其进行编码,以便在页面响应中对输入属性进行编码。 我的假设是,当我返回编码的响应时,在我的页面响应中,我将得到编码的字符,而在我的输入字段中,我会得到普通的字符,但我的输入域也设置了编码的字符。 下面是我在发送响应之前在控制器中编写的示例

  • 问题内容: 我有一个需要一些命令行输入的python脚本,并且我正在使用argparse进行解析。我发现文档有点混乱,找不到在输入参数中检查格式的方法。这个示例脚本解释了我检查格式的意思: 我需要检查选项,并且用户输入的格式为。我不知道argparse中有一个选项可以完成此任务。 问题答案: 根据文档: 的关键字参数允许执行任何必要的类型检查和类型转换…可以接受带有单个字符串参数并返回转换后值的任

  • 我的要求是既不显示相机预览,也不使用图像捕捉相机的意图。 在那里,我找到了一种适用于我的第一台测试设备(Galaxy tab 7)的方法。 我的功能如下所示 和< code>getCameraID功能如下 现在我面临着在不同设备上成功运行上述代码的困难。 三星Galaxy S(2.3.6):前置摄像头始终返回绿色图像,但编码后置摄像头工作正常。 三星Galaxy Nexus (4.1):编码不适用

  • 问题内容: 令我惊讶的是,and 方法对于相同的输入字符串返回不同的结果。 我试图将传递给这两种方法。但是给我错误的输出,却给我正确的输出。为什么? 问题答案: API文档是您的朋友。 可能没有按照您的想法做: 当且仅当 由参数命名的 系统属性 存在并且等于字符串“ true” 时,才返回true 。 您可能正在寻找: 如果字符串参数不为null,并且忽略大小写,等于字符串“ true”,则返回的