在Java中将Epoch秒转换为日期和时间格式

时间:2011-11-24 20:47:18

标签: java datetime-format epoch seconds

自1970年1月1日UTC(大纪元时间)起,我有几秒钟。

1320105600

我需要将这些秒转换为以下格式的日期和时间。

Friday,November 4,2011 5:00,AM

我怎样才能做到这一点?

5 个答案:

答案 0 :(得分:30)

如果您仅限于旧版java.util.Datejava.util.Calendar API,则需要考虑时间戳以毫秒而非秒为单位进行解释。因此,您首先需要将其乘以1000以获得时间戳(以毫秒为单位)。

long seconds = 1320105600;
long millis = seconds * 1000;

这样你就可以把它送到a.o. java.util.Date的构造函数,最后使用SimpleDateFormatjava.util.Date转换为java.lang.String所需的日期格式模式,必要时使用预定义的时区(否则将使用系统default time zone,这不是GMT / UTC本身,因此格式化的时间可能会关闭。

Date date = new Date(millis);
SimpleDateFormat sdf = new SimpleDateFormat("EEEE,MMMM d,yyyy h:mm,a", Locale.ENGLISH);
sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
String formattedDate = sdf.format(date);
System.out.println(formattedDate); // Tuesday,November 1,2011 12:00,AM

如果您已经使用Java8,那么可以使用LocalDateTime#ofEpochSecond()直接提供纪元秒数,而无需乘以毫秒的味道。

LocalDateTime dateTime = LocalDateTime.ofEpochSecond(seconds, 0, ZoneOffset.UTC);
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("EEEE,MMMM d,yyyy h:mm,a", Locale.ENGLISH);
String formattedDate = dateTime.format(formatter);
System.out.println(formattedDate); // Tuesday,November 1,2011 12:00,AM

答案 1 :(得分:10)

long yourSeconds = 1320105600L;
Date d = new Date(yourSeconds * 1000);

有关详细信息,请参阅此javadoc。构造函数需要几毫秒。

要以适当的格式显示此日期,您应该检查DateFormat

以下是一个例子:

DateFormat df = new SimpleDateFormat("dd MMM yyyy hh:mm:ss zzz");
System.out.println(df.format(date));

答案 2 :(得分:6)

java.time

Answer by BalusC很好用,它指向你使用java.time。但该答案使用LocalDateTime,其中Instant更合适。 LocalDateTime 时间轴上的一个时刻,因为它故意没有offset-from-UTCtime zone的概念。

java.time

java.time框架内置于Java 8及更高版本中。这些类取代了旧的麻烦日期时间类,例如java.util.Date.Calendar和& java.text.SimpleDateFormatJoda-Time团队还建议迁移到java.time。

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。

大部分java.time功能都被反向移植到Java 6& ThreeTen-Backport中的7,并在ThreeTenABP中进一步适应Android。

Instant

UTC中时间轴上的分辨率最高为nanoseconds的时刻由Instant类表示。

Instant instant = Instant.ofEpochSecond ( 1_320_105_600L );

转储到控制台。您的输入值是2011年11月1日UTC中的第一个时刻。最后的Z是Zulu'的缩写,表示UTC。

System.out.println ( "instant: " + instant );
  

时刻:2011-11-01T00:00:00Z

ZonedDateTime

在您的评论中,您提到希望通过America/Chicago时区的镜头查看此日期时间。使用proper time zone name。应用时区ZoneId以获取ZonedDateTime对象。我们看到芝加哥在那个日期落后于UTC五小时。

ZoneId zoneId = ZoneId.of ( "America/Chicago" );
ZonedDateTime zdt = instant.atZone ( zoneId );
  

zdt:2011-10-31T19:00-05:00 [America / Chicago]

字符串

上面看到的字符串采用标准ISO 8601格式。要生成其他格式的字符串,请使用DateTimeFormatter类。您可以指定自己的自定义模式。但通常最好让java.time自动本地化为Locale对象中编码的人类语言和文化规范。

DateTimeFormatter formatter = DateTimeFormatter.ofLocalizedDateTime ( FormatStyle.FULL );
formatter = formatter.withLocale ( Locale.US );
String output = zdt.format ( formatter );
  

2011年10月31日星期一下午7:00:00 CDT

要指定您自己的自定义格式,请搜索Stack Overflow以获取许多示例和更多讨论。

答案 3 :(得分:2)

int seconds = 1320105600;
Date date = new Date(seconds * 1000);
SimpleDateFormat sdf = new SimpleDateFormat("EEEE,MMMM d,yyyy h:mm,a");
System.out.println(sdf.format(date));

答案 4 :(得分:0)

诀窍是使用java.util.Datejava.text.DateFormat来获取所需的格式。您可以在tutorials on the Web中查找如何执行此操作。