Din*_*abu 4 java calendar gettime
Calendar c = Calendar.getInstance();
System.out.println(c.getTime());
c.set(2007, 0, 1);
System.out.println(c.getTime());
Run Code Online (Sandbox Code Playgroud)
输出:
Tue Sep 12 12:36:24 IST 2017
Mon Jan 01 12:36:24 IST 2007
但是,当我在不同的环境中使用相同的代码时,输出更改为:
输出:
Tue Sep 12 12:36:24 IST 2017
2007年1月1日星期一12:36:24 GMT
仅供参考,我尝试在设置值之前和之后打印日历实例的时区,两者都在"IST"中.
我想知道这个的根本原因.
您问题中的第二个输出是运行爱尔兰时间(欧洲/都柏林)的JVM上的正确和预期行为.2017年9月12日爱尔兰是夏季时间(夏令时).虽然它没有明确记载,Date.toString()(你调用隐式打印时,Date你得到c.getTime())打印在JVM的时区,其中9月份呈现为IST爱尔兰夏令时的日期和时间.
当您Calendar使用爱尔兰时间设置对象的日期时,保留一天中的小时; 在你的情况下,你得到爱尔兰标准时间2007年1月1日12:36:24.现在想象一下,如果将爱尔兰夏令时和爱尔兰标准时间都呈现为IST,那么会产生混淆.你无法区分.相反,由于爱尔兰标准时间与格林威治标准时间一致,因此Date.toString()当日期不在一年中的夏季时间(1月份不是)时打印.
我的猜测是你的第一个输出来自运行印度时间的JVM.它也被渲染为IST,并且由于印度不使用夏令时,因此夏季和冬季都会给出相同的缩写.
在了解您观察到的行为的解释之前,我发布了关于过时和现代Java日期和时间类的评论.不过,我仍然不认为评论有点偏僻.这是您的代码的现代等价物:
ZonedDateTime zdt = ZonedDateTime.now(ZoneId.of("Europe/Dublin"));
System.out.println(zdt);
zdt = zdt.with(LocalDate.of(2007, Month.JANUARY, 1));
System.out.println(zdt);
Run Code Online (Sandbox Code Playgroud)
它打印
2017-09-12T11:45:33.921+01:00[Europe/Dublin]
2007-01-01T11:45:33.921Z[Europe/Dublin]
Run Code Online (Sandbox Code Playgroud)
如果要使用JVM的时区设置,请使用ZoneId.systemDefault()而不是ZoneId.of("Europe/Dublin").正如名称所述,相反Date,ZonedDateTime确实包括时区.它更多地与旧Calendar班级相对应.如您所见,其toString方法Z以明确的区域/城市格式打印UTC(即零偏移)的偏移量和时区名称.我相信这样可以减少混淆的空间.如果要以特定格式打印日期,请使用DateTimeFormatter.
为了完整起见,以下是运行可能呈现为IST的不同时区时代码的输出:
欧洲/都柏林(同意你的第二个输出)
Tue Sep 12 11:19:28 IST 2017
Mon Jan 01 11:19:28 GMT 2007
Run Code Online (Sandbox Code Playgroud)亚洲/ Tel_Aviv
Tue Sep 12 13:19:28 IDT 2017
Mon Jan 01 13:19:28 IST 2007
Run Code Online (Sandbox Code Playgroud)Asia/Kolkata(同意您的第一个输出)
Tue Sep 12 15:49:28 IST 2017
Mon Jan 01 15:49:28 IST 2007
Run Code Online (Sandbox Code Playgroud)您需要设置时区,您将获得所需的结果.
TimeZone.setDefault(TimeZone.getTimeZone("IST"));
这是一个有效的代码.
import java.util.Calendar;
import java.util.TimeZone;
public class Cal {
public static void main(String[] args) {
// TODO Auto-generated method stub
TimeZone.setDefault(TimeZone.getTimeZone("IST")); // Add this before print
Calendar c = Calendar.getInstance();
System.out.println(c.getTime());
c.set(2007, 0, 1);
System.out.println(c.getTime());
}
}
Run Code Online (Sandbox Code Playgroud)
根据Doc "通常,您使用getDefault获取TimeZone,它根据程序运行的时区创建TimeZone.例如,对于在日本运行的程序,getDefault根据日本标准时间创建TimeZone对象."
因此,当您在不同时区运行时,它将用作默认时区.希望你现在明白.我附上了doc.请阅读.
| 归档时间: |
|
| 查看次数: |
6674 次 |
| 最近记录: |