如何在 Java 中将 currentTimeMillis 转换为日期?

我在服务器上生成的某个日志文件中有毫秒,我也知道生成日志文件的地区,我的问题是将毫秒转换为指定格式的日期。 日志的处理发生在位于不同时区的服务器上。虽然转换为“ SimpleDateFormat”程序是采取日期的机器,因为这样格式化的日期不代表正确的时间的服务器。有没有什么办法可以优雅地处理这件事?

long yourmilliseconds = 1322018752992l;
//1322018752992-Nov 22, 2011 9:25:52 PM


SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss,SSS",Locale.US);


GregorianCalendar calendar = new GregorianCalendar(TimeZone.getTimeZone("US/Central"));
calendar.setTimeInMillis(yourmilliseconds);


System.out.println("GregorianCalendar -"+sdf.format(calendar.getTime()));


DateTime jodaTime = new DateTime(yourmilliseconds,
DateTimeZone.forTimeZone(TimeZone.getTimeZone("US/Central")));
DateTimeFormatter parser1 = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss,SSS");


System.out.println("jodaTime "+parser1.print(jodaTime));

产出:

Gregorian Calendar -2011-11-23 08:55:52,992
jodaTime 2011-11-22 21:25:52,992
383745 次浏览

您可以使用 java.util.Date类,然后使用 SimpleDateFormat格式化 Date

Date date=new Date(millis);

我们可以使用 JavaSE8中引入的 爪哇时间包(教程)-DateTimeAPI。

var instance = java.time.Instant.ofEpochMilli(millis);
var localDateTime = java.time.LocalDateTime
.ofInstant(instance, java.time.ZoneId.of("Asia/Kolkata"));
var zonedDateTime = java.time.ZonedDateTime
.ofInstant(instance,java.time.ZoneId.of("Asia/Kolkata"));

// Format the date

var formatter = java.time.format.DateTimeFormatter.ofPattern("u-M-d hh:mm:ss a O");
var string = zonedDateTime.format(formatter);

如果 Millis 值是1970年1月1日以来的毫秒数,这是 JVM 的标准值,那么它与时区无关。如果您想用特定的时区格式化它,只需将其转换为 GregorianCalendar 对象并设置时区即可。之后,有许多方法来格式化它。

最简单的方法是使用 Joda 日期时间类并以毫秒为单位指定时间戳和所需的 DateTimeZone。

我强烈建议避免使用内置的 JavaDate 和 Calendar 类; 它们非常糟糕。

SimpleDateFormat 类有一个名为 SetTimeZone (TimeZone)的方法,该方法是从 DateFormat 类继承的

Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(timeStamp);


int mYear = calendar.get(Calendar.YEAR);
int mMonth = calendar.get(Calendar.MONTH);
int mDay = calendar.get(Calendar.DAY_OF_MONTH);

最简单的方法:

private String millisToDate(long millis){


return DateFormat.getDateInstance(DateFormat.SHORT).format(millis);
//You can use DateFormat.LONG instead of SHORT


}

下面是从毫秒到日期格式获取日期的解决方案。您必须使用 Joda 图书馆才能运行此代码。

import java.util.GregorianCalendar;
import java.util.TimeZone;


import org.joda.time.DateTime;
import org.joda.time.DateTimeZone;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;


public class time {


public static void main(String args[]){


String str = "1431601084000";
long geTime= Long.parseLong(str);
GregorianCalendar calendar = new GregorianCalendar(TimeZone.getTimeZone("US/Central"));
calendar.setTimeInMillis(geTime);
DateTime jodaTime = new DateTime(geTime,
DateTimeZone.forTimeZone(TimeZone.getTimeZone("US/Central")));
DateTimeFormatter parser1 = DateTimeFormat.forPattern("yyyy-MM-dd");
System.out.println("Get Time : "+parser1.print(jodaTime));


}
}

我的解决方案

public class CalendarUtils {


public static String dateFormat = "dd-MM-yyyy hh:mm";
private static SimpleDateFormat simpleDateFormat = new SimpleDateFormat(dateFormat);


public static String ConvertMilliSecondsToFormattedDate(String milliSeconds){
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(Long.parseLong(milliSeconds));
return simpleDateFormat.format(calendar.getTime());
}
}

我是这样做的:

static String formatDate(long dateInMillis) {
Date date = new Date(dateInMillis);
return DateFormat.getDateInstance().format(date);
}

也可以使用带有以下参数的 getDateInstance(int style):

DateFormat.SHORT

DateFormat.MEDIUM

DateFormat.LONG

DateFormat.FULL

DateFormat.DEFAULT

博士

Instant.ofEpochMilli( 1_322_018_752_992L )     // Parse count of milliseconds-since-start-of-1970-UTC into an `Instant`.
.atZone( ZoneId.of( "Africa/Tunis" ) )  // Assign a time zone to the `Instant` to produce a `ZonedDateTime` object.

细节

其他答案使用过时的或不正确的类。

避免使用旧的日期时间类,比如 java.util.Date/. Calendar。

爪哇时间

爪哇时间框架内置于 Java8及更高版本中。大部分功能是 移植到 Java6 & 7和进一步的 适应了安卓系统。由制作 Joda 时间的同一批人制作。

Instant协调世界时时间线上的一个时刻,分辨率为 纳秒。它的 新纪元是1970年世界协调时的第一个时刻。

假设您的输入数据是从1970-01-01 T00:00:00Z 开始的毫秒计数(在问题中不清楚) ,那么我们可以很容易地实例化一个 Instant

Instant instant = Instant.ofEpochMilli( 1_322_018_752_992L );

ToString () : 2011-11-23T03:25:52.992 Z

标准 ISO 8601格式字符串中的 ZZulu的缩写,意思是 协调世界时

使用 正确的时区名称应用一个时区,得到一个 ZonedDateTime

ZoneId zoneId = ZoneId.of( "Asia/Kolkata" ) ;
ZonedDateTime zdt = instant.atZone( zoneId );

看这个 代码在 IdeOne.com 上运行

Asia/Kolkata时区?

我猜你的代码受到了印度时区的影响。我们在这里看到,调整到 Asia/Kolkata时区呈现相同的时间,一天的报告,08:55是五个半小时以前,我们的 UTC 值 03:25

2011-11-23 T08:55:52.992 + 05:30[ Asia/Kolkata ]

默认区域

您可以应用 JVM 的 当前默认时区。请注意,默认值随时都可能改变 在运行时。JVM 中任何应用程序的任何线程中的任何代码都可以更改当前默认值。如果很重要,询问用户他们想要的/期望的时区。

ZoneId zoneId = ZoneId.systemDefault();
ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId );

关于 爪哇时间

< em > java.time 框架内置于 Java8及更高版本中。这些类取代了令人讨厌的旧的 遗产日期时间类,如 java.util.DateCalendarSimpleDateFormat

现在在 维修模式中的 尤达时间项目建议迁移到 爪哇时间类。

要了解更多,请参阅 < em > Oracle 教程 。并搜索堆栈溢出许多例子和解释。规范是 JSR 310

使用符合 JDBC 4.2或更高版本的 JDBC 驱动程序,您可以直接与数据库交换 爪哇时间对象。不需要字符串或 java.sql。课程 * 。

从哪里获得 java.time 类?

  • Java SE 8 < strong > JavaSE9 和更高版本
    • 内置的。
    • 带有捆绑实现的标准 JavaAPI 的一部分。
    • Java9添加了一些次要的特性和修复。
  • Java SE 6 和 < a href = “ https://en.wikipedia.org/wiki/Java _ version _ history # Java _ SE _ 7”rel = “ noReferrer”> < strong > Java SE 7
  • 仿生人
    • Java.time 类的 Android 捆绑包实现的后续版本。
    • 对于早期的 Android,项目适用于 310-后端口(上面提到过)。

< strong > Three Ten-Ultra 项目使用其他类扩展 java.time。这个项目是将来可能添加 java.time 的试验场。您可以在这里找到一些有用的类,比如 IntervalYearWeekYearQuarter更多

你可以试试 java.timeapi;

        Instant date = Instant.ofEpochMilli(1549362600000l);
LocalDateTime utc = LocalDateTime.ofInstant(date, ZoneOffset.UTC);
public static LocalDateTime timestampToLocalDateTime(Long timestamp) {
return LocalDateTime.ofInstant(Instant.ofEpochMilli(timestamp), TimeZone.getDefault().toZoneId());
}
 public static String getFormatTimeWithTZ(Date currentTime) {
SimpleDateFormat timeZoneDate = new SimpleDateFormat("EEE, dd-MM-yyyy  hh:mm a", Locale.getDefault());
return timeZoneDate.format(currentTime);
}

输出是

Mon,01-03-2021 07:37 PM

还有

public static String getFormatTimeWithTZ(Date currentTime) {
SimpleDateFormat timeZoneDate = new SimpleDateFormat("EEE, dd-MM-yyyy  HH:mm ", Locale.getDefault());
return timeZoneDate.format(currentTime);
}

输出是

Mon,01-03-2021 19:37

如果你不想要天然后删除 EEE,
如果不需要“日期”,请删除 dd-MM-yyyy
如果你想要以小时、分钟、秒、毫秒为单位的时间,那么使用 HH: mm: ss.SSS

并在需要的地方调用此方法

getFormatTimeWithTZ(Mydate)

哪里

Date Mydate = new Date(System.currentTimeMillis());