当前位置: 首页 > 知识库问答 >
问题:

如何将Joda DateTime转换为UTC MySql时间戳

殷建弼
2023-03-14
String ztime = "2013-10-07T08:00:00Z";  

DateTimeFormatter parser = ISODateTimeFormat.dateTimeParser();
DateTime dt = parser.parseDateTime(ztime).withZone(DateTimeZone.UTC);

PreparedStatement stmt = con.prepareStatement("insert into time_test (time) values (?)");
stmt.setTimestamp(1, Timestamp(dt.getMillis()));
stmt.execute();

但是,当我在数据库中查找时,存储的时间是由数据库时区与UTC的差值得出的。例如,当我的数据库在UTC+1运行时,运行上面的代码保存“08:00z”,数据库中的时间戳显示为09:00。

datetime的getMillis方法说“从1970-01-01t00:00:00z的Java纪元获取datetime瞬间的毫秒。”MySql的时间戳显示:“MySql将时间戳值从当前时区转换为UTC以存储,然后从UTC转换为当前时区以检索”,所以我认为是MySql转换导致了问题,因为初始化时使用的millis相对于固定的UTC时间,所以它不需要从当前时区转换为UTC。

我将数据读回DateTime的代码工作得很好,我得到了我放入的值,但是我还需要它来处理一些我无法控制的第三方代码,它期望时间戳在正确的UTC时间中。

我如何获得数据库中的时间戳字段以匹配我的原始UTC日期/时间?

共有1个答案

晋俊贤
2023-03-14

使用代替joda-time的java.time类。

myPreparedStatement.setObject( 
    … , 
    Instant.parse( "2013-10-07T08:00:00Z" )  
)

取回。

myResultSet.getObject( 
    … ,
    Instant.class 
)

Joda-Time项目现在处于维护模式,建议迁移到它的后继者Java8和更高版本中内置的Java.time类。两人都由同一个人领导,斯蒂芬·科尔伯恩。您将发现许多相同的概念,因此迁移相当容易。

String input = "2013-10-07T08:00:00Z" ;     // Standard ISO 8601 format.
Instant instant = Instant.parse( input ) ;  // Parses standard ISO 8601 format by default.
myPreparedStatement.setObject( … , instant ) ;
Instant instant = myResultSet.getObject( … , Instant.class ) ;

Java.time框架内置在Java8和更高版本中。这些类取代了麻烦的旧的遗留日期-时间类,如java.util.dateCalendar、&SimpleDateFormat

现在处于维护模式的Joda-Time项目建议迁移到java.time类。

要了解更多信息,请参阅Oracle教程。并搜索堆栈溢出以获得许多示例和解释。规范是JSR310。

  • Java SE 8、Java SE 9、Java SE 10及更高版本
    • 内置。
    • 带有捆绑实现的标准Java API的一部分。
    • Java 9添加了一些小功能和修补程序。
    • 大部分Java.time功能在threeten-backport中后端移植到Java6&7。
    • java.time类的Android捆绑实现的更高版本。
    • 对于早期的Android(<26),ThreeTenABP项目适用于ThreeTen-Backport(上面提到)。查看如何使用ThreeTenabp…。

 类似资料:
  • 问题内容: 我正在通过使用语法将字段转换为时间。 约会时间 当前输出:时间 我只需要而不是毫秒或0000 如何过滤或将其转换为精确格式。 问题答案: 不以其 显示格式 存储在SQL Server中。 因此,从用户角度来看,您可以说它 没有格式。 当然,由于它确实具有 存储格式 ,因此并不完全准确,但是作为普通用户,您不能真正使用它。 这是所有的日期和时间数据类型真: ,,,,和。 如果您需要格式,

  • 问题内容: 我正在寻找将UTC时间字符串转换为Unix时间戳的选项。 我拥有的字符串变量是,需要将其转换为unix时间戳,例如 任何想法如何做到这一点? 问题答案: 首先,unix时间戳没有时间,但以UTC为单位。 在包有功能解析与预计解析时的布局。布局是从参考时间开始构造的。因此,在您的情况下,布局应为。使用Parse之后,您将获得一个可以调用Unix来接收Unix时间戳的结构。

  • 然而,我想知道你如何将它转换成没有GMT或年份的时间和日期,例如Sat 04月03日14:00:00,这就是它 我的Add.java 我的配置文件.java 这里的任何帮助都将得到极大的理解。

  • 问题内容: 我想将日期转换为时间戳,我的输入是。我用了 上面写着NaN ..有人能告诉你如何转换吗? 问题答案: var myDate = “26-02-2012”; myDate = myDate.split(“-“); var newDate = myDate[1]+”,”+myDate[0]+”,”+myDate[2]; console.log(new Date(newDate).getTi

  • 我已经尝试从firebase时间戳中获取日期和时间,如下所示: 但我得到的结果是:

  • 问题内容: 如何指定格式字符串以将日期单独转换为字符串。就我而言,只有日期部分是相关的 将其构造为失败: 有错误 可能是因为我应该改用。但是,我看不到任何格式化程序。什么是转换的最佳方式进入(或别的东西,如果这是不正确的表示) 谢谢… 问题答案: 您可能正在寻找。这有点令人困惑,因为它采用了通用类型,但是文档指出如果将a 传递给构造函数,它将使用一个知道如何处理a的a ,例如

  • 问题内容: 由于某种原因,我将时间格式转换为:。我想将其转换回原来的第一个(相同)格式。怎么可能 我的尝试: 现在,分钟呢? 考虑价值可能就像 我认为您了解了一样。 顺便说一下,如何转换 问题答案: 如果要获取时间格式:

  • Code A可以将长值转换为日期值,就像2018.01.10一样 > 我希望得到日期时间值 ,如 2018.01.10 23:11,我该如何使用 Kotlin? 我希望将当前时间转换为长值,我该如何使用Kotlin? 谢谢! 代码A