Java Calendar.DAY_OF_YEAR 有时差一个

标签 java javax.xml

我正在尝试根据用户的出生日期获取用户的年龄。出生日期以 XML 中的字符串形式给出,并转换为 Calendar,如下所示:

final Calendar dob = javax.xml.bind.DatatypeConverter.parseDate(value);

然后我像这样计算用户的年龄:

final Calendar now = Calendar.getInstance();
int age = now.get(Calendar.YEAR) - dob.get(Calendar.YEAR);
if (now.get(Calendar.DAY_OF_YEAR) < dob.get(Calendar.DAY_OF_YEAR)) {
  --age;
}

我今天发现,如果今天是用户的生日(收起派对帽,那不是我的生日),那么年龄就会小一岁。也就是说,如果用户是 2000 年出生的,今天是她的生日,那么她应该是 14 岁,而不是 13 岁。但归根结底,Java 似乎把 DAY_OF_YEAR 弄错了:

System.out.println(String.format("Today: %d-%d; Birthday: %d-%d", now.get(Calendar.MONTH), now.get(Calendar.DAY_OF_MONTH), dob.get(Calendar.MONTH), dob.get(Calendar.DAY_OF_MONTH)));
// prints: Today: 9-22; Birthday: 9-22
System.out.println(String.format("Today: %d; Birthday: %d", now.get(Calendar.DAY_OF_YEAR), dob.get(Calendar.DAY_OF_YEAR)));
// prints: Today: 295; Birthday: 296

什么给了?

最佳答案

边缘条件导致了问题。

2000 有什么特别之处?

今年是闰年。

    Calendar cal = new GregorianCalendar();
    cal.set(2000, 11, 31);
    System.out.println(cal.getTime());
    System.out.println(cal.get(Calendar.DAY_OF_YEAR));

输出:

Sun Dec 31 13:43:28 EST 2000
366

2 月 29 日之后的所有内容都被 1 抵消,特别是对于闰年。因此,这没有错。事实上,它正在按预期工作。

您应该比较月份和日期来解决这个问题。

关于Java Calendar.DAY_OF_YEAR 有时差一个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26513482/

相关文章:

java - 为什么我的 sonarqube 在进行单元测试时覆盖率为 0%?

java - List<User> 未删除 RecyclerView 适配器中包含的 POJO 对象

java - JDK 10 无法在 Eclipse 中导入 javax.xml.namespace

java - java中可以有带有多个可选参数的泛型方法

java - Google Cloud Dataflow 管道中的 NotSerializedException : org. apache.avro.io.DecoderFactory

java - Jax-RS Response.created(location) 用于带有路径参数的路由

Java 相当于 Matlab 的 `eps` 或 Numpy/Python 的 `spacing` 函数(浮点相对精度)

java - 如何在我的 JSON 响应中隐藏信息?

java - JAXB 删除不必要的嵌套 XML 标记