5

我正在尝试将时间设置为 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
4

3 回答 3

7

这条线没有做你认为它做的事情:

c2.set(date.getYear(), (date.getMonth() - 1), date.getDay());

类中不推荐使用的方法Date如下所示:

  • getYear()返回年份 - 1900,例如 1986 返回为 86,而 2013 返回为 113。
  • getMonth()返回月份 - 1,因此 11 月返回 10。减去 1 得到 10 月。
  • getDay()返回星期几;星期二返回为 2。

因此,根据您的日期,您将日历的日期设置为 113 年 10 月 2 日。API 的正确用法是:

c2.set(1900+date.getYear(), date.getMonth(), date.getDate());
于 2013-11-05T15:09:25.300 回答
4

您的方法会有点麻烦,尤其是由于时区和夏令时。许多Date方法已被弃用,因为它们使用起来令人困惑。我喜欢使用的方法是这样的:

Calendar c = Calendar.getInstance();
c.setTimeInMillis(date.getTime());

//get the same day but previous month
c.add(Calendar.MONTH, -1);

这样我就让Calendar计算。

于 2013-11-05T15:37:31.173 回答
1

这个没有问题

    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

于 2013-11-05T15:13:28.427 回答