我遇到了一个问题:我想长时间获得GMT TimeZone的当前时间。 我使用下面给出的代码:
TimeZone timeZoneGmt = TimeZone.getTimeZone("GMT");
long gmtCurrentTime = getCurrentTimeInSpecificTimeZone(timeZoneGmt);
public static long getCurrentTimeInSpecificTimeZone(TimeZone timeZone) {
Calendar cal = Calendar.getInstance();
cal.setTimeZone(timeZone);
long finalValue = 0;
SimpleDateFormat sdf = new SimpleDateFormat(
"MMM dd yyyy hh:mm:ss:SSSaaa");
sdf.setTimeZone(timeZone);
Date finalDate = null;
String date = sdf.format(cal.getTime());
try {
finalDate = sdf.parse(date);
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
finalValue = finalDate.getTime();
return finalValue;
}
如上所述,上述方法
格式化时
String date = sdf.format(cal.getTime());
我在GMT中获得了正确的当前时间,但正如我通过以下代码解析:
finalDate=sdf.parse(date);
日期从当前GMT时间更改为2013年IST 2013年15:35:16,这是我系统的当前时间。
我尝试使用日历以另一种方式:
TimeZone timeZoneGmt=TimeZone.get("GMT");
Calendar calGmt = Calendar.getInstance();
calGmt.setTimeZone(timeZoneGmt);
long finalGmtValue = 0;
finalGmtValue = calGmt.getTimeInMillis();
System.out.println("Date......" + calGmt.getTime());
但仍然是我的系统的当前时间日期1月23日15:58:16 IST 2014未获得GMT当前时间。
答案 0 :(得分:7)
你误解了Date
是如何运作的。 Date
没有时区 - 如果您使用Date.toString()
,则总是会看到默认时区。 Date
中的long值纯粹是自Unix时代以来的毫秒数:它没有任何时区或日历系统的概念。
如果您想在特定时区和日历中表示日期和时间,请改用Calendar
- 但要获取“当前日期和时间长”,您只需使用System.currentTimeMillis()
,这与系统时区无关。
此外,即使您 希望像这样进行操作,也不应该使用字符串转换。你不是从概念上执行任何字符串转换,那么为什么要介绍它们呢?
如果您的目标是在特定时区显示(作为字符串)当前日期和时间,您应该使用以下内容:
Date date = new Date(); // This will use the current time
SimpleDateFormat format = new SimpleDateFormat(...); // Pattern and locale
format.setTimeZone(zone); // The zone you want to display in
String formattedText = format.format(date);
使用日期和时间API时 - 特别是像Java Calendar
/ Date
API那样糟糕的 - 它非常非常重要,您可以准确理解系统中的每个值表示。