Java:以UTC显示时间

时间:2014-03-30 10:03:01

标签: java datetime timezone utc

我正在使用Java Calendar API

尝试使用一段代码
class TimeIssue 
{
    public void showUTCTime(long millis, final String msg)
    {
        Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
        cal.setTimeInMillis(0);
        System.out.println(msg + "(UTC):" + cal.getTime());
    }

    public void showLocalTime(long millis, final String msg)
    {
        Calendar cal = Calendar.getInstance();
        cal.setTimeInMillis(0);
        System.out.println(msg + "(LOCAL):" + cal.getTime());
    }

    public static void main(String[] args)
    {
        long epochSec = 0;
        TimeIssue obj = new TimeIssue();

        obj.showUTCTime(epochSec, "EPOCH");
        obj.showLocalTime(epochSec, "EPOCH");
     }
}

执行此程序时,输出为(我的时区为GMT + 5:30)

EPOCH(UTC):Thu Jan 01 05:30:00 IST 1970
EPOCH(LOCAL):Thu Jan 01 05:30:00 IST 1970

我在这里有两个问题

        
  • 输出的第一行不应该是Jan 01 00:00:00 UTC 1970
  •     
  • 为什么即使我设定了时区,我也会获得IST时间

你能否建议我在这里找不到什么?

阿布舍克巴克

3 个答案:

答案 0 :(得分:3)

Calendar.getTime()方法返回Date对象,这只是自纪元以来的毫秒数。打印该实例将调用Date#toString()方法,该方法使用系统默认时区格式化日期。为Calendar实例提供时区,不会将生成的Date对象与该时区关联。实际上,Date对象没有时区概念。

您想要的是使用DateFormat自行格式化日期,并在其中设置时区。将您的UTC方法更改为:

public void showUTCTime(long millis, final String msg) {
    Calendar cal = Calendar.getInstance();
    cal.setTimeInMillis(0);
    DateFormat dateFormat = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy");
    dateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
    System.out.println(msg + "(UTC):" + dateFormat.format(cal.getTime()));
}

答案 1 :(得分:0)

问题是您通过拨打obj.showUTCTime(epochSec, "EPOCH");来设置时区,并在此之后保存。您需要在showLocalTime中再次设置它以使其他时间显示在另一个时区。

第一行输出是您所在时区的UTC 00:00:00 1970,即5:30

答案 2 :(得分:0)

accepted answer是正确的。

避免java.util.Date

如果您使用称职的图书馆,使用日期时间和时区会更容易。众所周知,java.util.Date和.Calendar类很麻烦。在Java 8中使用Joda-Time或java.time包(受Joda-Time启发)。

约达时间

Joda-Time 2.5中的示例代码。我们实例化一对DateTime对象,这些对象表示Universe时间轴中的相同时刻,但从两个不同的挂钟时间(UTCIndia)看。

DateTime dateTimeUtc = new DateTime( 0, DateTimeZone.UTC );
DateTimeZone timeZoneKolkata = DateTimeZone.forID( "Asia/Kolkata" );
DateTime dateTimeKolkata = dateTimeUtc.withZone( timeZoneKolkata );