久久久久久久av_日韩在线中文_看一级毛片视频_日本精品二区_成人深夜福利视频_武道仙尊动漫在线观看

2 月 java.util.Calendar 的一個(gè)奇怪行為

A strange behavior from java.util.Calendar on February(2 月 java.util.Calendar 的一個(gè)奇怪行為)
本文介紹了2 月 java.util.Calendar 的一個(gè)奇怪行為的處理方法,對(duì)大家解決問題具有一定的參考價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧!

問題描述

限時(shí)送ChatGPT賬號(hào)..

我遇到了來自 java.util.Calendar 的奇怪行為:

I faced with a strange behavior from java.util.Calendar:

import static org.junit.Assert.*;
import org.junit.Test;

import java.util.Calendar;

public class Tester1 {
    @Test
    public void test_monthOfDate() {
        assertEquals(1, monthOfDate(2013, 1, 30)); // OK
        assertEquals(1, monthOfDate(2013, 1, 31)); // OK

        // Start of February
        assertEquals(2, monthOfDate(2013, 2, 1));  // FAIL
        assertEquals(2, monthOfDate(2013, 2, 28)); // FAIL
        // to the end of it

        // and after that it is okay also
        assertEquals(3, monthOfDate(2013, 3, 1));  // OK
    }

    public int monthOfDate(int year, int month, int day) {
        Calendar cal = Calendar.getInstance();
        cal.set(Calendar.YEAR, year);
        cal.set(Calendar.MONTH, month - 1);

        // just a simple get! but seems it is very important
        cal.get(Calendar.MONTH);
        //

        cal.set(Calendar.DAY_OF_MONTH, day);

        return cal.get(Calendar.MONTH) + 1;
    }
}

我想知道為什么會(huì)這樣?

I want to know why exactly this is happening?

推薦答案

問題是您從 2013 年 1 月 30 日開始的日歷.

The problem is that you're starting off with a calendar on January 30th 2013.

然后您將年份設(shè)置為 2013 年 - 這不是問題.

You're then setting the year to 2013 - that's not a problem.

然后您將月份設(shè)置為 1(即二月).你期望在這里發(fā)生什么?實(shí)際發(fā)生的是它會(huì)記住它需要將月份設(shè)置為 1,但 不會(huì) 重新計(jì)算實(shí)際時(shí)間值.根據(jù) 文檔(重點(diǎn)是我的):

You're then setting the month to 1 (i.e. February). What do you expect to happen here? What actually happens is that it will remember that it needs to set the month to 1, but not recompute the actual time value. The time value will be recomputed on your call to get though, as per the documentation (emphsis mine):

set(f, value) 將日歷字段 f 更改為 value.此外,它設(shè)置一個(gè)內(nèi)部成員變量來指示日歷字段 f 已更改.盡管日歷字段 f 立即更改,但在下一次調(diào)用 get()、getTime()、getTimeInMillis()、add() 或 roll() 之前,不會(huì)重新計(jì)算日歷的時(shí)間值(以毫秒為單位).因此,多次調(diào)用 set() 不會(huì)觸發(fā)多次不必要的計(jì)算.作為使用 set() 更改日歷字段的結(jié)果,其他日歷字段也可能更改,具體取決于日歷字段、日歷字段值和日歷系統(tǒng).另外,get(f)在重新計(jì)算日歷字段后,不一定會(huì)返回調(diào)用set方法設(shè)置的值.具體由具體的日歷類決定.

set(f, value) changes calendar field f to value. In addition, it sets an internal member variable to indicate that calendar field f has been changed. Although calendar field f is changed immediately, the calendar's time value in milliseconds is not recomputed until the next call to get(), getTime(), getTimeInMillis(), add(), or roll() is made. Thus, multiple calls to set() do not trigger multiple, unnecessary computations. As a result of changing a calendar field using set(), other calendar fields may also change, depending on the calendar field, the calendar field value, and the calendar system. In addition, get(f) will not necessarily return value set by the call to the set method after the calendar fields have been recomputed. The specifics are determined by the concrete calendar class.

當(dāng)您嘗試將1 月 30 日"更改為2 月 30 日"并強(qiáng)制進(jìn)行計(jì)算時(shí),實(shí)際上會(huì)發(fā)生的是您在 3 月 2 日結(jié)束了我的盒子 - 但您的可能會(huì)有所不同實(shí)施.

When you try to change "January 30th" to "February 30th" and force a computation, what actually happens is that you end up on March 2nd on my box - but it may differ on your implementation.

最好的修復(fù)方法是:

  • 使用 Calendar.set(year, month, date) 來避免這個(gè)排序問題
  • 首先使用 Joda Time 作為更合理的 API.
  • Use Calendar.set(year, month, date) instead to avoid this ordering issue
  • Use Joda Time as a more sensible API in the first place.

這篇關(guān)于2 月 java.util.Calendar 的一個(gè)奇怪行為的文章就介紹到這了,希望我們推薦的答案對(duì)大家有所幫助,也希望大家多多支持html5模板網(wǎng)!

【網(wǎng)站聲明】本站部分內(nèi)容來源于互聯(lián)網(wǎng),旨在幫助大家更快的解決問題,如果有圖片或者內(nèi)容侵犯了您的權(quán)益,請(qǐng)聯(lián)系我們刪除處理,感謝您的支持!

相關(guān)文檔推薦

Parsing an ISO 8601 string local date-time as if in UTC(解析 ISO 8601 字符串本地日期時(shí)間,就像在 UTC 中一樣)
How to convert Gregorian string to Gregorian Calendar?(如何將公歷字符串轉(zhuǎn)換為公歷?)
Java: What/where are the maximum and minimum values of a GregorianCalendar?(Java:GregorianCalendar 的最大值和最小值是什么/在哪里?)
Calendar to Date conversion for dates before 15 Oct 1582. Gregorian to Julian calendar switch(1582 年 10 月 15 日之前日期的日歷到日期轉(zhuǎn)換.公歷到儒略歷切換)
java Calendar setFirstDayOfWeek not working(java日歷setFirstDayOfWeek不起作用)
Java: getting current Day of the Week value(Java:獲取當(dāng)前星期幾的值)
主站蜘蛛池模板: 国产在线中文字幕 | 狠狠操电影 | 成人免费观看男女羞羞视频 | 天天影视亚洲综合网 | h视频免费在线观看 | 国产又色又爽又黄又免费 | 精品久久久久久久久久久 | 久久精品视频网站 | 国产色婷婷精品综合在线手机播放 | 热re99久久精品国99热观看 | 欧美福利一区 | 欧美成人影院在线 | 国产欧美精品在线 | 麻豆av一区二区三区久久 | 日韩精品一区二区三区视频播放 | 色综久久 | 波多野结衣中文字幕一区二区三区 | 99久久久无码国产精品 | 超碰操 | 久久国内精品 | 中文久久 | 青青草一区 | 日韩在线免费电影 | 韩日三级 | 亚洲区中文字幕 | 免费看片在线播放 | 一区二区三区在线观看视频 | 国产一区二区三区亚洲 | 激情福利视频 | 精品毛片在线观看 | 黄色av免费网站 | 亚洲精品成人 | 成人免费在线观看视频 | 国产第一区二区 | 亚洲国产一区在线 | 日韩成人免费av | 97国产精品视频人人做人人爱 | 午夜免费观看网站 | 日本福利视频 | 亚洲国产一区二区视频 | 伊人在线|