gpt4 book ai didi

java - 使用仅字符串格式化程序将纪元时间戳字符串转换为Joda日期时间

转载 作者:行者123 更新时间:2023-11-30 11:04:57 24 4
gpt4 key购买 nike

假设我有一个时间戳记“ 1355409000003”作为字符串,是否可以指定一种DateTime格式将其解析为Joda DateTime?

即,我可以使用格式“ MM / dd / YYYY”来解析“ 12/01/2012”,使用“ YYYY-MM-dd HH:mm”来解析“ 2012-12-01 04:27”,但是如何解析“ 1355409000003”?

编辑:不使用其他构造函数,假设我必须指定要解析的字符串格式

最佳答案

tl; dr

只是parse your String to long。没什么大不了。

使用替代Joda-Time项目的java.time类。

Instant.ofEpochMilli( 
Long.parseLong( "1355409000003" )
)



  2012-12-13T14:30:00.003Z


String解析为 long

您的问题没有任何意义。如果您获得一个字符串,表示从1970-01-01T00:00Z的纪元以来的毫秒数,则将 String转换为 long并传递给Joda-Time DateTime类型的构造函数。

这在 an Answer中显示,它被莫名删除。

DateTime dt = new DateTime( Long.parseLong( "1355409000003" ) ) ;


或者,我个人将分为两行。

long millisSinceEpoch = Long.parseLong( "1355409000003" ) ;
DateTime dt = new DateTime( millisSinceEpoch ) ;


您将此评论发布到了该问题:


  不幸的是,使用这些时间戳的结构并不适合使用其他构造函数-假设我需要指定一个字符串格式,是否有一种可以解析历元时间戳的格式?


同样,您坚持使用 String的构造函数是荒谬的,因为简单到用解析调用包装您的文本数字很简单: Long.parseLong( "1355409000003" )Don’t make a mountain out of a molehill.

java.time

Joda-Time项目现在位于 maintenance mode中,团队建议迁移到 java.time类。

Instant类表示 UTC中时间轴上的时刻,分辨率为 nanoseconds(十进制小数的九(9)位)。

使用java.time的方法与上述使用Joda-Time的方法相同:将 String解析为 long,并使用数字获取 Instant对象(而不是 DateTime对象)。

java.time类避免使用构造函数。因此,与其调用构造函数,不如调用静态工厂方法 Instant.ofEpochMilli

long millisSinceEpoch = Long.parseLong( "1355409000003" ) ;
Instant instant = Instant.ofEpochMilli( millisSinceEpoch ) ;


自定义方法

如果提示您坚持的问题是整个代码中都发生这种情况,并且您想避免用所有额外的 Long.parseLong(乱码您的代码库,那么您可以使用自己的实用程序方法来封装此字符串到长转换。

我不建议这样做,因为这似乎有些过分。但是如果您坚持,这里是一些示例代码。

package com.basilbourque.example;

import java.time.Instant;

public class InstantMaker
{
static public Instant parseMillis ( String countOfMillisecondsSinceEpoch )
{
// TODO - Add code to test for invalid inputs, trap for exception thrown.
long millis = Long.parseLong( countOfMillisecondsSinceEpoch );
Instant instant = Instant.ofEpochMilli( millis);
return instant;
}

// Constructor. Hide the default constructor as "private". We have no need for instances here.
private InstantMaker ( )
{
}

// `main` method for testing ad demonstration.
public static void main ( String[] args )
{
Instant instant = InstantMaker.parseMillis( "1355409000003" );
System.out.println( instant );
}
}


如果这是您的问题,我建议真正的问题是依赖于历元计数,而不管它是文本还是数字。由于人无法分辨这些值,因此从纪元开始计数会使日期时间处理变得更加困难。这使故障排除,调试和日志记录变得棘手且不必要地复杂。我建议将您的代码重构为围绕 Instant实例传递,而不是像 "1355409000003"这样的字符串传递。

ISO 8601

如果必须将日期时间值序列化为文本,请仅使用标准的 ISO 8601格式。这是标准的主要目的,即在系统之间交换日期时间值。这些格式被设计为实用且合理,易于通过机器解析,但易于跨文化的人阅读。

解析/生成字符串时,默认情况下java.time类使用标准ISO 8601格式。您可以在上面的“答案”中看到此类字符串的示例。



关于java.time

java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧 legacy日期时间类,例如 java.util.DateCalendarSimpleDateFormat

现在位于 Joda-Time中的 maintenance mode项目建议迁移到 java.time类。

要了解更多信息,请参见 Oracle Tutorial。并在Stack Overflow中搜索许多示例和说明。规格为 JSR 310

您可以直接与数据库交换java.time对象。使用与 JDBC driver或更高版本兼容的 JDBC 4.2。不需要字符串,不需要 java.sql.*类。

在哪里获取java.time类?


Java SE 8Java SE 9和更高版本


内置的
标准Java API的一部分,具有捆绑的实现。
Java 9添加了一些次要功能和修复。

Java SE 6Java SE 7


ThreeTen-Backport中的大部分java.time功能都已反向移植到Java 6和7。

Android


更高版本的Android捆绑了java.time类的实现。
对于较早的Android(<26), ThreeTenABP项目改编了ThreeTen-Backport(如上所述)。请参见 How to use ThreeTenABP…



ThreeTen-Extra项目使用其他类扩展了java.time。该项目是将来可能向java.time添加内容的试验场。您可能会在这里找到一些有用的类,例如 IntervalYearWeekYearQuartermore

关于java - 使用仅字符串格式化程序将纪元时间戳字符串转换为Joda日期时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29831424/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com