java - 为什么其中一种方法适用于设置日期,而另一种方法则不行?

标签 java android calendar gregorian-calendar

在这两种情况下,我想在此示例中以毫秒为单位设置的日期是 1395227280627,人类可读格式是 3/19/2014 12:08:00 PM

1) 这是第一种方法,它不能正常工作:

Calendar ret1=GregorianCalendar.getInstance();
ret1.set(Calendar.YEAR, year);
ret1.set(Calendar.MONTH, month);
ret1.set(Calendar.DAY_OF_YEAR, day);
ret1.set(Calendar.HOUR_OF_DAY, hour);
ret1.set(Calendar.MINUTE, minute);
ret1.set(Calendar.SECOND, 0);
Log.e("Time in millis:", Long.toString(ret1.getTimeInMillis()));

此方法的输出为 1390129680626,以毫秒为单位,人类可读格式为 1/19/2014 12:08:00 PM。问题是月份设置不正确。

2) 第二种正确的方法是:

Calendar ret2=GregorianCalendar.getInstance();
ret2.set(year, month, day, hour, minute, 0);
Log.e("Time in millis:", Long.toString(ret2.getTimeInMillis()));

这种方法的输出是 1395227280627 以毫秒为单位,3/19/2014 12:08:00 PM 是人类可读的格式,这正是我想要的。我很好奇出了什么问题,经过一些研究,很多人都说 java 日历很糟糕,并且有很多非常奇怪的东西,包括一些损坏的部分。我已经开始回溯有效的方法,结果如下:

回溯calendar.set(year, month, day, hour, minute, second)

/**
 * Sets the year, month, day of the month, hour of day, minute, and second fields.
 * Other fields are not changed; call {@link #clear} first if this is not desired.
 * The month value is 0-based, so it may be clearer to use a constant like {@code JANUARY}.
 */
public final void set(int year, int month, int day, int hourOfDay, int minute, int second) {
    set(year, month, day, hourOfDay, minute);
    set(SECOND, second);
}

所以 second 部分转换为我在第一种方法中所做的,检查。

回溯 calendar.set(year, month, day, hourOfDay, minute)

/**
 * Sets the year, month, day of the month, hour of day, and minute fields.
 * Other fields are not changed; call {@link #clear} first if this is not desired.
 * The month value is 0-based, so it may be clearer to use a constant like {@code JANUARY}.
 */
public final void set(int year, int month, int day, int hourOfDay, int minute) {
    set(year, month, day);
    set(HOUR_OF_DAY, hourOfDay);
    set(MINUTE, minute);
}

所以 hourOfDayminute 部分转换为我在第一种方法中所做的,检查。

回溯calendar.set(year, month, day)

/**
 * Sets the year, month, and day of the month fields.
 * Other fields are not changed; call {@link #clear} first if this is not desired.
 * The month value is 0-based, so it may be clearer to use a constant like {@code JANUARY}.
 */
public final void set(int year, int month, int day) {
    set(YEAR, year);
    set(MONTH, month);
    set(DATE, day);
}

所以 yearmonthday 部分完全转换为我在第一种方法中所做的。

结论是,我在第一种方法中进行的每次调用都以完全相同的方式在第二种方法中被调用,所以我不明白发生了什么。谁能帮我解决这个问题,并解释为什么会这样?

最佳答案

我认为问题在于您使用了错误的日历设置来设置日期

ret1.set(Calendar.DAY_OF_YEAR, day);

对应于 1-365 之间的数字(即设置为 19 将有效地将月份设置为 1 月 19 日)

我觉得你想要

ret1.set(Calendar.DAY_OF_MONTH, day);

关于java - 为什么其中一种方法适用于设置日期,而另一种方法则不行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22502709/

相关文章:

java - 如何管理动态创建按钮的 onClickListener?

android - 如何在android中使用GPS坐标测量从当前位置到另一个位置的面积

java - 在其他时区午夜时获取本地时间

java - 奇怪的 Java SQL 时间戳日历检索行为 - 从日历中获取毫秒?

java - 确定一个字符串具有所有唯一字符而不使用额外的数据结构并且没有小写字符假设

java - 无法在jsp页面使用登录

java - 带有安全管理器的 Swing 应用程序导致奇怪的 GUI 刷新问题

选中和取消选中时Android更改选项卡栏文本颜色

java - tensorflow float32的转换与java对象不兼容

css - 如何设置 SmartGwt 日历的样式