求问 使用calendar类时获取当月天数出现的莫名问题

木秀林 2018-05-14 02:45:54
程序是这样的

@Test
public void fun1() {
Calendar calendar = Calendar.getInstance(TimeZone
.getTimeZone("GMT-8:00"));
SimpleDateFormat simpleDateFormat = new SimpleDateFormat(
"yyyy-MM-dd HH:mm:ss");
String format = simpleDateFormat.format(calendar.getTime());
System.out.println(format);
System.out.println(calendar.get(Calendar.YEAR));
System.out.println((calendar.get(Calendar.MONTH) + 1) );
System.out.println(calendar.get(Calendar.DAY_OF_MONTH));
}

预期应该都是同一天
但是结果是

2018-05-14 14:51:36
2018
5
13

求问 原因 ?
翻看源码也没找到问题关键所在
使用Java1.7 myeclipse 14版
...全文
1058 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
木秀林 2018-05-23
  • 打赏
  • 举报
回复
引用 13 楼 dong_19890208 的回复:
[quote=引用 9 楼 qq_35530042 的回复:] [quote=引用 8 楼 dong_19890208 的回复:] [quote=引用 7 楼 qq_35530042 的回复:] [quote=引用 6 楼 dong_19890208 的回复:] 刚才看了Calendar 的源码,Calender.getTime() 内部 掉的的是 new Date(getTimeInMillis());
 Calendar calendar1 = Calendar.getInstance();
        System.out.println(calendar1.getTimeInMillis());
        Calendar calendar = Calendar.getInstance(TimeZone
                .getTimeZone("GMT-8:00"));
        System.out.println(calendar.getTimeInMillis());
通过测试两个得到的值是近似相同的,所以用simpleDateFormat.format(calendar.getTime())取的是本机的时间,也就是东八区的时间; calendar.get(Calendar.DAY_OF_MONTH)是有时区转换的,由于你初始设置的时区是西八区,比东八区落后相差十几个小时,所以日期少了一天
时区是正解,改成加8小时就对了 ,但是 我用simpledataformat 转不需要涉及到时区吗? 那它怎么转成了和我设置时区的相同时间[/quote]Calender.getTime() 内部实现是 new Date(getTimeInMillis()); Calender.getTimeInMillis() 跟时区无关,所以Calender.getTime() 也就跟时区无关了[/quote] 其实我后面不太懂为什么用时间毫秒算会和时区无关? 难道不是所有地方的时区毫秒都是一样的吗? 还是所有不同时区的或者说不同地点的距离时间毫秒数不一样 ?如果不一样那它不应该还是设置了时区吗?如果一样那为什么能转成对应的时间格式[/quote]https://www.jianshu.com/p/bf47458a0423 看看这篇文章,里面应该讲清楚了[/quote] 理解了 正解 谢谢
dong_19890208 2018-05-18
  • 打赏
  • 举报
回复
引用 9 楼 qq_35530042 的回复:
[quote=引用 8 楼 dong_19890208 的回复:] [quote=引用 7 楼 qq_35530042 的回复:] [quote=引用 6 楼 dong_19890208 的回复:] 刚才看了Calendar 的源码,Calender.getTime() 内部 掉的的是 new Date(getTimeInMillis());
 Calendar calendar1 = Calendar.getInstance();
        System.out.println(calendar1.getTimeInMillis());
        Calendar calendar = Calendar.getInstance(TimeZone
                .getTimeZone("GMT-8:00"));
        System.out.println(calendar.getTimeInMillis());
通过测试两个得到的值是近似相同的,所以用simpleDateFormat.format(calendar.getTime())取的是本机的时间,也就是东八区的时间; calendar.get(Calendar.DAY_OF_MONTH)是有时区转换的,由于你初始设置的时区是西八区,比东八区落后相差十几个小时,所以日期少了一天
时区是正解,改成加8小时就对了 ,但是 我用simpledataformat 转不需要涉及到时区吗? 那它怎么转成了和我设置时区的相同时间[/quote]Calender.getTime() 内部实现是 new Date(getTimeInMillis()); Calender.getTimeInMillis() 跟时区无关,所以Calender.getTime() 也就跟时区无关了[/quote] 其实我后面不太懂为什么用时间毫秒算会和时区无关? 难道不是所有地方的时区毫秒都是一样的吗? 还是所有不同时区的或者说不同地点的距离时间毫秒数不一样 ?如果不一样那它不应该还是设置了时区吗?如果一样那为什么能转成对应的时间格式[/quote]https://www.jianshu.com/p/bf47458a0423 看看这篇文章,里面应该讲清楚了
木秀林 2018-05-17
  • 打赏
  • 举报
回复
引用 6 楼 dong_19890208 的回复:
刚才看了Calendar 的源码,Calender.getTime() 内部 掉的的是 new Date(getTimeInMillis());
 Calendar calendar1 = Calendar.getInstance();
        System.out.println(calendar1.getTimeInMillis());
        Calendar calendar = Calendar.getInstance(TimeZone
                .getTimeZone("GMT-8:00"));
        System.out.println(calendar.getTimeInMillis());
通过测试两个得到的值是近似相同的,所以用simpleDateFormat.format(calendar.getTime())取的是本机的时间,也就是东八区的时间; calendar.get(Calendar.DAY_OF_MONTH)是有时区转换的,由于你初始设置的时区是西八区,比东八区落后相差十几个小时,所以日期少了一天
时区是正解,改成加8小时就对了 ,但是 我用simpledataformat 转不需要涉及到时区吗? 那它怎么转成了和我设置时区的相同时间
dong_19890208 2018-05-17
  • 打赏
  • 举报
回复
引用 7 楼 qq_35530042 的回复:
[quote=引用 6 楼 dong_19890208 的回复:] 刚才看了Calendar 的源码,Calender.getTime() 内部 掉的的是 new Date(getTimeInMillis());
 Calendar calendar1 = Calendar.getInstance();
        System.out.println(calendar1.getTimeInMillis());
        Calendar calendar = Calendar.getInstance(TimeZone
                .getTimeZone("GMT-8:00"));
        System.out.println(calendar.getTimeInMillis());
通过测试两个得到的值是近似相同的,所以用simpleDateFormat.format(calendar.getTime())取的是本机的时间,也就是东八区的时间; calendar.get(Calendar.DAY_OF_MONTH)是有时区转换的,由于你初始设置的时区是西八区,比东八区落后相差十几个小时,所以日期少了一天
时区是正解,改成加8小时就对了 ,但是 我用simpledataformat 转不需要涉及到时区吗? 那它怎么转成了和我设置时区的相同时间[/quote]Calender.getTime() 内部实现是 new Date(getTimeInMillis()); Calender.getTimeInMillis() 跟时区无关,所以Calender.getTime() 也就跟时区无关了
wcwtitxu 2018-05-17
  • 打赏
  • 举报
回复
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd  HH:mm:ss");
	    simpleDateFormat.setTimeZone(TimeZone.getTimeZone("GMT-8:00"));
	    String format = simpleDateFormat.format(calendar.getTime());
DateFormat 也要设置一样的时区 时间戳与时区无关,所有地区在同一时刻时间戳是一样的
木秀林 2018-05-17
  • 打赏
  • 举报
回复
引用 10 楼 zl1394047374 的回复:
额,我运行了下你的代码,日期一致,没错误啊
你运行没错误是因为刚好卡在了我们的时间和-8小时时区一致的情况 你再过几个小时再去运行就会遇到出错的情况了
zl1394047374 2018-05-17
  • 打赏
  • 举报
回复
额,我运行了下你的代码,日期一致,没错误啊
木秀林 2018-05-17
  • 打赏
  • 举报
回复
引用 8 楼 dong_19890208 的回复:
[quote=引用 7 楼 qq_35530042 的回复:] [quote=引用 6 楼 dong_19890208 的回复:] 刚才看了Calendar 的源码,Calender.getTime() 内部 掉的的是 new Date(getTimeInMillis());
 Calendar calendar1 = Calendar.getInstance();
        System.out.println(calendar1.getTimeInMillis());
        Calendar calendar = Calendar.getInstance(TimeZone
                .getTimeZone("GMT-8:00"));
        System.out.println(calendar.getTimeInMillis());
通过测试两个得到的值是近似相同的,所以用simpleDateFormat.format(calendar.getTime())取的是本机的时间,也就是东八区的时间; calendar.get(Calendar.DAY_OF_MONTH)是有时区转换的,由于你初始设置的时区是西八区,比东八区落后相差十几个小时,所以日期少了一天
时区是正解,改成加8小时就对了 ,但是 我用simpledataformat 转不需要涉及到时区吗? 那它怎么转成了和我设置时区的相同时间[/quote]Calender.getTime() 内部实现是 new Date(getTimeInMillis()); Calender.getTimeInMillis() 跟时区无关,所以Calender.getTime() 也就跟时区无关了[/quote] 其实我后面不太懂为什么用时间毫秒算会和时区无关? 难道不是所有地方的时区毫秒都是一样的吗? 还是所有不同时区的或者说不同地点的距离时间毫秒数不一样 ?如果不一样那它不应该还是设置了时区吗?如果一样那为什么能转成对应的时间格式
dong_19890208 2018-05-14
  • 打赏
  • 举报
回复
刚才看了Calendar 的源码,Calender.getTime() 内部 掉的的是 new Date(getTimeInMillis());
 Calendar calendar1 = Calendar.getInstance();
        System.out.println(calendar1.getTimeInMillis());
        Calendar calendar = Calendar.getInstance(TimeZone
                .getTimeZone("GMT-8:00"));
        System.out.println(calendar.getTimeInMillis());
通过测试两个得到的值是近似相同的,所以用simpleDateFormat.format(calendar.getTime())取的是本机的时间,也就是东八区的时间; calendar.get(Calendar.DAY_OF_MONTH)是有时区转换的,由于你初始设置的时区是西八区,比东八区落后相差十几个小时,所以日期少了一天
Cathy313 2018-05-14
  • 打赏
  • 举报
回复
因为你GMT-8:00是西八区时间,calendar.getTime()得到的是当前系统时间。改成GMT+8:00(东八区--北京时间)就一致了
天行归来 2018-05-14
  • 打赏
  • 举报
回复
引用 楼主 qq_35530042 的回复:
程序是这样的

	@Test
	public void fun1() {
		Calendar calendar = Calendar.getInstance(TimeZone
				.getTimeZone("GMT-8:00"));
		SimpleDateFormat simpleDateFormat = new SimpleDateFormat(
				"yyyy-MM-dd  HH:mm:ss");
		String format = simpleDateFormat.format(calendar.getTime());
		System.out.println(format);
		System.out.println(calendar.get(Calendar.YEAR));
		System.out.println((calendar.get(Calendar.MONTH) + 1) );
		System.out.println(calendar.get(Calendar.DAY_OF_MONTH));
	}
预期应该都是同一天 但是结果是

2018-05-14  14:51:36
2018
5
13
求问 原因 ? 翻看源码也没找到问题关键所在 使用Java1.7 myeclipse 14版
这里调整下即可,表示北京时间 TimeZone.getTimeZone("GMT-8:00")=>TimeZone.getTimeZone("gmt+8:00")
dong_19890208 2018-05-14
  • 打赏
  • 举报
回复
引用 1 楼 dong_19890208 的回复:
DayOfMonth是从0开始的
不好意思,我刚才看了下Calendar的源码,DayOfMonth是从1开始的
QWERT4745 2018-05-14
  • 打赏
  • 举报
回复
设置时区没?
dong_19890208 2018-05-14
  • 打赏
  • 举报
回复
DayOfMonth是从0开始的

62,628

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧