public static Timestamp getCurrentTimeGMT() {
Calendar c = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
long time = c.getTimeInMillis();
long offset = TimeZone.getDefault().getOffset(time);
return new Timestamp(time - offset);
}
但当我尝试使用相同的方法进行微小更改以获得GMT + 3中的当前时间 它给了我与GMT相同的结果?我不知道为什么:
public static Timestamp getCurrentTimeGMT3() {
Calendar c = Calendar.getInstance(TimeZone.getTimeZone("GMT+3"));
long time = c.getTimeInMillis();
long offset = TimeZone.getDefault().getOffset(time);
return new Timestamp(time - offset);
}
任何想法为什么上面的代码不能正常工作,以及如何做这样的方法?
答案 0 :(得分:4)
Timestamp
扩展Date
- 概念上它 时区。它只代表了一个瞬间。
如果要在具有特定时区的特定日历中显示它,那就是格式化问题。使用相关时区创建适当的日历,并相应地设置其中的时间戳。
(按照惯例,我建议您尽可能使用Joda Time而不是内置API。它更干净。)
答案 1 :(得分:2)
为什么从最后一行的时间减去偏移量?这基本上是将你的时间重新设置回GMT。您检索GMT + 3然后从中减去3小时。
答案 2 :(得分:2)
Jon说的话。时间戳没有时区,它始终是UTC,并且实际上不应该滥用来表示本地时间。如果你真的需要对象代表当地时间,Joda Time has a class for that。
你应该知道“GMT + 3”不是真正有效的时区。时区不仅具有基本偏移,还具有夏令时偏移,对于具有相同基本偏移的时区,时区偏移可以不同,并且由于立法,甚至可以针对相同时区进行更改。实时区域ID是“Europe / Berlin”或“Australia / Darwin”。
答案 3 :(得分:0)
c.getTimeInMillis()
返回自1970年1月1日0:00 UTC以来的毫秒数,并且无论在Calendar实例中使用哪个时区,都将返回相同的值。
如果您使用时区创建日历并需要访问时间字段,则应直接访问这些日历:
int h = c.get(Calendar.HOUR_OF_DAY);
int m = c.get(Calendar.MINUTE);
int s = c.get(Calendar.SECOND);
答案 4 :(得分:0)
使用Timezone静态方法。
TimeZone default = TimeZone.getDefault();
TimeZone.setDefault(TimeZone.getTimeZone("GMT+3"));
Calendar cal = Calendar.getInstance();
cal.setTime(new Date(System.currentTimeMillis()));
Date date = cal.getTime(); // converted date time
System.out.println(date.toString());
// Set Back to System Default
TimeZone.setDefault(default);
答案 5 :(得分:0)
通过示例代码获取不同时区的时间
public class GetZoneDateTime {
public static void main(String[] args) throws Exception {
String reqTzId = "Asia/Singapore";
LocalDateTime now = LocalDateTime.now();
System.out.println("Local Now: " + now + " TimeZone: " + TimeZone.getDefault());
ZoneId zoneId = ZoneId.of(reqTzId);
System.out.println("Req TimeZone : " + zoneId);
LocalDateTime localNow = LocalDateTime.now(zoneId);
System.out.println("tzLocalDateTime: " + localNow);
ZonedDateTime zoneNow = ZonedDateTime.now(zoneId);
System.out.println("tzZonedDateTime: " + zoneNow);
}
}