我正在使用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
我在这里有两个问题
你能否建议我在这里找不到什么?
阿布舍克巴克
答案 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时间轴中的相同时刻,但从两个不同的挂钟时间(UTC和India)看。
DateTime dateTimeUtc = new DateTime( 0, DateTimeZone.UTC );
DateTimeZone timeZoneKolkata = DateTimeZone.forID( "Asia/Kolkata" );
DateTime dateTimeKolkata = dateTimeUtc.withZone( timeZoneKolkata );