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

如何在Java中将currentTimeMillis转换为日期?,java,date,Java,Date,我在服务器中生成的某些日志文件中有毫秒,我还知道生成日志文件的区域设置,我的问题是将毫秒转换为指定格式的日期。 该日志的处理正在位于不同时区的服务器上进行。当转换为“SimpleDateFormat”时,程序会将机器的日期作为格式化日期,因为格式化日期并不代表服务器的正确时间。有没有办法优雅地处理这件事 long yourmilliseconds = 1322018752992l; //1322018752992-Nov 22, 2011 9:25:52 PM SimpleD

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

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

Date date=new Date(millis);
我们可以使用JavaSE8中引入的包(教程)-日期时间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"));
//格式化日期

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

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

最简单的方法是使用,并指定时间戳(以毫秒为单位)和所需的日期时区


我强烈建议避免使用内置的Java日期和日历类;它们太可怕了。

SimpleDataFormat类有一个从DateFormat类继承的名为SetTimeZone(TimeZone)的方法

最简单的方法:

private String millisToDate(long millis){

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

}

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

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样式)
与以下参数一起使用:

DateFormat.SHORT

DateFormat.MEDIUM

DateFormat.LONG

DateFormat.FULL

DateFormat.DEFAULT

tl;博士 细节 其他答案使用过时或不正确的类

避免使用旧的日期时间类,如java.util.date/.Calendar。事实证明,它们设计拙劣、令人困惑且麻烦

java.time 该框架内置于Java8及更高版本中。大部分功能都是可扩展的。由一些和我一样的人做的

a是时间线上的一个时刻,分辨率为。这是UTC 1970年的第一个时刻

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

Instant instant = Instant.ofEpochMilli( 1_322_018_752_992L );
instant.toString():2011-11-23T03:25:52.992Z

标准格式字符串中的
Z
Zulu
的缩写,意思是

使用,应用时区以获取

看这个

亚洲/加尔各答
时区? 我猜您的代码可能受印度时区的影响。我们在这里看到,调整到时区会呈现与您报告的时间相同的时间,
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 );

关于java.time 该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,例如,&

该项目现已启动,建议迁移到类

要了解更多信息,请参阅。并搜索堆栈溢出以获得许多示例和解释。规格是

使用符合或更高版本的,您可以直接与数据库交换java.time对象。不需要字符串或java.sql.*类

从哪里获得java.time类

  • ,及以后
    • 内置的
    • 标准JavaAPI的一部分,带有捆绑实现
    • Java9添加了一些次要功能和修复
    • 大部分java.time功能都在中向后移植到Java6和Java7
    • 更高版本的Android捆绑包实现了java.time类
    • 对于早期的Android,该项目采用了ThreeTen Backport(如上所述)。看

该项目使用其他类扩展了java.time。这个项目是java.time将来可能添加的一个试验场。您可以在这里找到一些有用的类,如、、和。

您可以尝试java.time api

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

Mon,01-03-2021 07:37 PM

输出为

Mon,01-03-2021 19:37
如果您不想要这些天,请删除EEE,
如果不需要日期,请删除dd-MM-yyyy
如果您希望时间以小时、分钟、秒、毫秒为单位,请使用HH:mm:ss.SSS

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

getFormatTimeWithTZ(Mydate)
在哪里


高尔吉安加朗德没有工作。。。无论出于什么原因,它都需要系统默认时区。Joda工作得很好。如果我们可以用GregorianFYI做一些不同的事情,请让我看看示例代码,项目现在正在进行中,建议迁移到类。请参阅。这是使用GregorianCalendar和Joda的示例代码,我使用Joda获得了正确的输出,但使用Gregorian GregorianCalendar calendar=new GregorianCalendar(TimeZone.getTimeZone(“US/Central”);calendar.setTimeInMillis(毫秒);DateTime jodaTime=newdatetime(毫秒,DateTimeZone.forTimeZone(TimeZone.getTimeZone(“US/Central”));DateTimeFormatter parser1=DateTimeFormat.forPattern(“yyyy-MM-dd HH:MM:ss,SSS”);在calendar对象中设置时区不起作用,但在date formatter对象中设置时区起作用了?什么是DateTime和DateTimeFormatter?我必须将calendar设置为final才能使其起作用<代码>最终日历=Calendar.getInstance()日历对象通常被认为相当大,因此应尽可能避免使用。日期对象i
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
getFormatTimeWithTZ(Mydate)
Date Mydate = new Date(System.currentTimeMillis());