我正在尝试将时间设置为Calendar实例,但我遇到了奇怪的行为。我们来看看一些例子:
Calendar c = Calendar.getInstance();
//c.setTime(date);
c.set(date.getYear(), (date.getMonth() - 1), date.getDay());
int dayOfWeek = c.get(Calendar.DAY_OF_WEEK);
当我使用setTime()设置时间时,它会设置错误的日期。第二个(和已弃用的)集(年,月,日)正常工作。我之前从未见过这个 - 我认为它在两种情况下都使用默认时区,所以它应该是相同的。有人可以向我解释一下吗?
====================编辑:让我们问另一种方式:
Date date = new Date();
Calendar c1 = Calendar.getInstance();
c1.setTime(date);
Calendar c2 = Calendar.getInstance();
c2.set(date.getYear(), (date.getMonth() - 1), date.getDay());
int day1 = c1.get(Calendar.DAY_OF_WEEK);
int day2 = c2.get(Calendar.DAY_OF_WEEK);
// day1 != day2 ---> I'd like to know - WHY?
所以现在的日期如下:
date: Nov 5, 2013 4:27:02 PM
day1: 3
day2: 1
time: 1383665222638
timezone: Europe/Prague
答案 0 :(得分:6)
此行不符合您的预期:
c2.set(date.getYear(), (date.getMonth() - 1), date.getDay());
Date
类中已弃用的方法的工作方式如下:
getYear()
返回年份 - 1900年,因此例如1986年返回为86,2013年返回为113. getMonth()
返回月份 - 1,因此11月将返回10.减去1会给出10月份。getDay()
返回星期几;星期二以2返回。因此,根据您的日期,您将日历的日期设置为10月2日113.正确使用API将是:
c2.set(1900+date.getYear(), date.getMonth(), date.getDate());
答案 1 :(得分:4)
你的方法会有点毛茸茸,特别是因为时区和夏令时。许多Date
方法已被弃用,因为它们令人困惑。
我喜欢使用的方法是:
Calendar c = Calendar.getInstance();
c.setTimeInMillis(date.getTime());
//get the same day but previous month
c.add(Calendar.MONTH, -1);
这样我让Calendar
进行计算。
答案 2 :(得分:0)
这个
没有问题 Calendar c = Calendar.getInstance();
c.setTime(new Date());
c.set(2013, (12 - 1), 05);
int dayOfWeek = c.get(Calendar.DAY_OF_WEEK);
如果您尝试执行某些操作,则会因为您使用Date而弃用。
c.set(new Date().getYear(), (new Date().getMonth() - 1), new Date().getDate());
//don't use `java.util.Date` here since there can be differences
java.util.Calendar
超过java.util.Date