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

时间:2011-11-23 04:08:16

标签: java date

我在服务器中生成的某个日志文件中有毫秒数,我也知道生成日志文件的区域设置,我的问题是将指定格式的毫秒转换为日期。 该日志的处理发生在位于不同时区的服务器上。转换为“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

13 个答案:

答案 0 :(得分:243)

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

Date date=new Date(millis);

我们可以使用java.time包(教程) - Java SE 8中引入的DateTime API。

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

答案 1 :(得分:101)

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

答案 2 :(得分:20)

TL;博士

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。事实证明,它们设计糟糕,令人困惑且麻烦。

java.time

java.time框架内置于Java 8及更高版本中。许多功能是backported to Java 6 & 7adapted to Android。由与Joda-Time制作的一些人制作。

InstantUTC中时间轴上的一个时刻,分辨率为nanoseconds。其epoch是1970年UTC的第一个时刻。

假设您的输入数据是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格式字符串中的ZZulu的缩写,表示UTC

使用proper time zone name应用时区,以获得ZonedDateTime

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

code run live at IdeOne.com

Asia/Kolkata时区?

我猜你的印度时区正在影响你的代码。我们在此处看到,调整为Asia/Kolkata时区会在报告时生成相同的时间,08:55比我们的UTC值03:25提前五个半小时。

  

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

默认区域

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

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

关于 java.time

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

现在位于Joda-Timemaintenance mode项目建议迁移到java.time类。

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

如果JDBC driver符合JDBC 4.2或更高版本,您可以直接与数据库交换 java.time 对象。不需要字符串或java.sql。* classes。

从哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuartermore

答案 3 :(得分:13)

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

答案 4 :(得分:12)

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

我强烈建议避免使用内置的Java Date和Calendar类;他们太可怕了。

答案 5 :(得分:10)

我的解决方案

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

答案 6 :(得分:6)

我这样做:

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

答案 7 :(得分:5)

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

答案 8 :(得分:5)

最简单的方法:

private String millisToDate(long millis){

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

}

答案 9 :(得分:2)

以下是我从毫秒到日期格式获取日期的解决方案。您必须使用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));

   }
}

答案 10 :(得分:1)

您可以尝试java.time api;

        Instant date = Instant.ofEpochMilli(1549362600000l);
        LocalDateTime utc = LocalDateTime.ofInstant(date, ZoneOffset.UTC);

答案 11 :(得分:0)

public static LocalDateTime timestampToLocalDateTime(Long timestamp) {
    return LocalDateTime.ofInstant(Instant.ofEpochMilli(timestamp), TimeZone.getDefault().toZoneId());
}

答案 12 :(得分:0)

 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

如果您不想要 Days Then Remove EEE,
如果您不想要日期,则删除 dd-MM-yyyy
如果您想要以小时、分钟、秒、毫秒为单位的时间,请使用 HH:mm:ss.SSS

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

getFormatTimeWithTZ(Mydate)

哪里

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