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

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

 1320105600

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

 2011年11月4日星期五上午5点00分

我怎样才能做到这一点?

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

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

通过这种方式,您可以将其提供给java.util.Date的构造函数,最后使用SimpleDateFormatjava.util.Date转换为所需日期格式模式的java.lang.String ,必要时使用预定义的时区(否则)它将使用系统默认时区 ,这不是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 
 long yourSeconds = 1320105600L; Date d = new Date(yourSeconds * 1000); 

这里javadoc是描述。 构造函数需要几毫秒。

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

这是一些例子:

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

java.time

BalusC的答案很好,因为它指向你使用java.time。 但该答案使用LocalDateTime ,其中Instant更合适。 LocalDateTime 不是时间轴上的时刻,因为它故意没有从UTC或时区 偏移的概念。

java.time

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

要了解更多信息,请参阅Oracle教程 。 并搜索Stack Overflow以获取许多示例和解释。

大部分java.timefunction都被反向移植到ThreeTen-Backport中的 Java 6和7,并进一步适应了ThreeTenABP中的 Android。

Instant

Instant类表示UTC时间轴上的分辨率高达纳秒的时刻。

 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时区的镜头看到这个日期时间。 使用适当的时区名称 。 应用时区ZoneId以获取ZonedDateTime对象。 我们看到芝加哥在那个日期落后于UTC五小时。

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

zdt:2011-10-31T19:00-05:00 [美国/芝加哥]

字符串

上面看到的字符串是标准的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分CDT

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

 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)); 

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