Java如何将UTC毫秒转换为UTC日期

时间:2015-10-30 07:30:15

标签: java utc

我有一个int 1446159600,它是UTC / GMT日期星期四,2015年10月29日23:00:00 GMT。我尝试转换为实际的UTC日期,但无法使用Calendar,SimpleDateFormat和Timezone类。有人能帮助我吗?

6 个答案:

答案 0 :(得分:1)

to;dr

Instant.ofEpochSecond ( 1_446_159_600L )

2015-10-29T23:00:00Z

Count From Epoch

You appear to have an integer count-from-epoch counting whole seconds with an epoch of Unix time, the first moment of 1970 in UTC.

The old date-time classes you reference are based on milliseconds. So multiply by 1,000.

java.time

Even better, avoid those old classes altogether. The new java.time framework in Java 8 and later is a vast improvement, supplanting those old classes. See Tutorial. These new classes have a resolution of nanoseconds, or 9 decimal places in a fraction of a second.

The Instant class (a moment on the timeline in UTC) even has a handy ofEpochSecond method, so no need to multiply by a thousand.

long wholeSecondsFromEpochInUtc = 1_446_159_600L;
Instant instant = Instant.ofEpochSecond ( wholeSecondsFromEpochInUtc );

That solves your Question in a one-liner.

Formatting

We can go further. Apply a time zone to that Instant to get a ZonedDateTime.

ZoneId zoneId = ZoneId.of ( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant ( instant , zoneId );
DateTimeFormatter formatter = DateTimeFormatter.ofLocalizedDateTime ( FormatStyle.FULL ).withLocale ( Locale.CANADA_FRENCH );
String output = zdt.format ( formatter );

Dump to console.

System.out.println ( "instant (UTC): " + instant );
System.out.println ( "zdt: " + zdt );
System.out.println ( "output: " + output );

instant (UTC): 2015-10-29T23:00:00Z

zdt: 2015-10-29T19:00-04:00[America/Montreal]

output: jeudi 29 octobre 2015 19 h 00 EDT

答案 1 :(得分:0)

实际上1446159600毫秒是"星期六1月17日23:12:39 IST 1970"。 IST是我当地的时间。

但是,您可以使用Calendar对象获取关联日期,如下所示。

    Calendar cal = new GregorianCalendar();
    cal.setTimeInMillis(1446159600 );
    System.out.println(cal.getTime());

并且,这个输出恰好是"周六1月17日23:12:39 IST 1970"

另外,如果要将毫秒转换为日期,可以使用http://currentmillis.com/ 它给出了与给定毫秒相关的日期。

答案 2 :(得分:0)

也许我误解了这个问题,但这会从当前时间以毫秒为单位创建一个日期:

public class DateTime
{
  public static void main (String[] args)
  {
    long time = System.currentTimeMillis ();
    System.out.println (time);
    Date date = new Date (time);
    System.out.println (date);
  }
}

输出:

1446191239738
Fri Oct 30 18:47:19 AEDT 2015

答案 3 :(得分:0)

// print the time in local time zone
        Date date = new Date(1446159600);
        System.out.println(date);

        // print UTC time 
        TimeZone utcTimeZone = TimeZone.getTimeZone("UTC");

        Calendar calendar = Calendar.getInstance(utcTimeZone);

        SimpleDateFormat simpleDateFormat = new SimpleDateFormat(
                "EE MMM dd HH:mm:ss zzz yyyy", Locale.US);
        simpleDateFormat.setTimeZone(utcTimeZone);
        calendar.setTimeInMillis(date.getTime());

        System.out.println(simpleDateFormat.format(calendar.getTime()));

        //print in local time zone 
        //Because getTime method actully call new Date(long millsecond);

        /* public final Date getTime() {
                return new Date(getTimeInMillis());
            }*/
        System.out.println(calendar.getTime());

答案 4 :(得分:0)

时间戳似乎是以秒为单位,而大多数java使用毫秒,所以我们必须乘以1000。

    long timestampMilliseconds = 1446159600*1000L;
    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("EEE, d MMM yyyy HH:mm:ss z", Locale.US);
    simpleDateFormat.setTimeZone(TimeZone.getTimeZone("GMT"));
    String stringDate = simpleDateFormat.format(new Date(timestampMilliseconds));
    System.out.println(stringDate); // Thu, 29 Oct 2015 23:00:00 GMT

1000之后的L是使得乘法作为长值完成,并且该数字不会溢出整数最大值。您可以使用((long)1446159600)*10001446159600L*1000或其他任何内容来获得相同的效果。您也可以使用TimeUnit.SECONDS.toMillis(1446159600)

答案 5 :(得分:0)

签出此代码:

    // Make a format for showing the date
    DateFormat dateFormat = new SimpleDateFormat("dd MMM, yyy", Locale.FRANCE);
    // Make a format for showing the time
    DateFormat timeFormat = new SimpleDateFormat("hh:mm a", Locale.FRANCE);

    // Get the current time in UTC (in milliseconds since 01 Jan 1970)
    Long currentUTCDate = Calendar.getInstance().getTimeInMillis();

    // Convert the current time from UTC to normal date
    Date currentDate = new Date(currentUTCDate);

    // Take the date only from currentDate object using the dateFormat we made before
    // and pass it to currentDateOnly String
    String currentDateOnly = dateFormat.format(currentDate);
    // Do the same with the time
    String currentTimeOnly = timeFormat.format(currentDate);


在此代码中,我们可以区分三个主要的不同类:
1. SimpleDateFormat(),它返回类型为DateFormat的对象
2. Calendar,其中一种方法是getTimeInMillis()
3. Date,它使对象可以保存您给它的时间的所有详细信息

现在:
getTimeInMillis()返回一个Long类型的数字,该数字保存自1970年1月1日以来的当前毫秒数。
我们使用这种类型的时间来简化具有日期的计算。
。在Date类中,我们有一个构造函数,该构造函数将getTimeInMillis()中的Long数字作为参数,并为我们返回Date类型的对象,该对象包含我们赋予它的时间的每个细节在构造函数中。
。现在,我们不需要对象currentDate拥有的所有详细信息,因此我们制作了一个过滤器,仅从currentDate对象获取日期和时间,并使用了{{ 1}}。
。制作类型为DateFormat的对象,我们使用DateFormat构造函数,并将SimpeDateFormat()作为要获取的特定parameter的{​​{1}}传递给它来自我们的String对象,例如(“ dd MMM,yyy”),它在我们的代码中:

pattern

。最后,我们将currentDate对象作为DateFormat dateFormat = new SimpleDateFormat("dd MMM, yyy", Locale.FRANCE); 方法的currentDate对象,该方法将向我们返回一个字符串,该字符串的过滤日期与我们提供的模式相同,在我们的示例中paremeter,结果将类似于:
dateFormat.format()