如何将currentTimeMillis转换为Java中的date?

我在服务器生成的某些日志文件有毫秒,我也知道从哪里生成日志文件的区域设置,我的问题是将毫秒转换为指定格式的date。 该日志的处理发生在位于不同时区的服务器上。 转换为“SimpleDateFormat”程序正在取得机器的date,因为这样的格式化date不代表服务器的正确时间。 有没有办法处理这个优雅?

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

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

 Date date=new Date(millis); 

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

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

我强烈build议避免内置的Javadate和日历类; 他们太可怕了

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

避免使用诸如java.util.Date/.Calendar之类的旧date时间类。 他们被certificatedevise不好,令人困惑和麻烦。

java.time

java.time框架内置于Java 8及更高版本中。 许多function被反向移植到Java 6和7,并进一步适应Android 。 由与Joda-Time相同的人所做的 。

Instant是UTC时间线上的一个时刻,分辨率为纳秒 。 它的时代是1970年的第一个时刻。

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

 Instant instant = Instant.ofEpochMilli( 1_322_018_752_992L ); 

instant.toString():2011-11-23T03:25:52.992Z

该标准ISO 8601格式string中的ZZulu缩写,意为UTC 。

使用适当的时区名称应用时区,以获得ZonedDateTime

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

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

Asia/Kolkata时区?

我猜你的印象是有一个时区影响你的代码。 我们在这里看到,调整到Asia/Kolkata时区的时间与您报告的时间相同,即08:55 ,比我们的UTC值03:25提前了五个半小时。

2011-11-23T08:55:52.992 + 05:30 [亚/加尔各答]

默认区域

您可以应用JVM的当前默认时区 。 请注意,默认情况下可以在运行时随时更改。 JVM中任何应用程序的任何线程中的任何代码都可以更改当前的默认值。 如果重要,请询问用户所需的/预期的时区。

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

我的解决scheme

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

SimpleDateFormat类有一个从DateFormat类inheritance的名为SetTimeZone(TimeZone)的方法。 http://docs.oracle.com/javase/6/docs/api/java/text/DateFormat.html

最简单的方法:

 private String millisToDate(long millis){ return DateFormat.getDateInstance(DateFormat.SHORT).format(millis); //You can use DateFormat.LONG instead of SHORT } 

我这样做:

 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

下面是我的解决scheme,以从毫秒到date格式的date。 你必须使用Joda Library来运行这个代码。

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