簡體   English   中英

Java檢查數月

[英]Java Checking number months

我想我知道我想問什么問題我不想得到(Calendar.MONTH)我希望該月份不大於上一個caldendar月份,這就是為什么我要進行-1個月,我意識到如果我使用get(calendar.MONTH)現在是11月,我只想查看一下並確保它不大於12月12日到計算機11的值。這就是為什么每隔一個月都無效,這就是我的問題試圖得到答案!?

public Date(String inString)  
{
    int month;// is define by cutting up the inString like this
    int day; // same as month
    int getSlash;

    getSlash = inStr.indexOf('/');
    month = Integer.parseInt(inStr.substring(0,getSlash));
    day = Integer.parseInt(inStr.substring(getSlash + 1));

    inStr = String.format("%02d/%02d%n",month,day);// padformatting string
    inStr=  new SimpleDateFormat("MM/dd").format(new SimpleDateFormat("MM/dd").parse(inStr));// checking to see if a actualdate

    GregorianCalendar cal = new GregorianCalendar();

    // this is what I don't understand after reading

    if (month -1 > cal.get(Calendar.MONTH ) // how do I get it to say int of the month if the user types in 12 it gets invalid
    {
        System.out.Println("Invalid Month -> " + month");
    }

}

當我在11月份以外的所有時間都視為無效時,有人知道為什么嗎? 我想不明白。

自己解析日期和時間是一個壞主意-與使用Java的內置功能一樣。

我無法確切地說出您想做什么或出了什么問題,但是我可以肯定地說使用Joda Time是個好主意。

然后,您可以使用ReadableDateTime.getMonthOfYear()或其他一些易用的方法,而不是使用帶有神秘常數的get (並調整基於0的月份ReadableDateTime.getMonthOfYear() 好多了。

例如,要獲取當前月份,您可以使用:

int currentMonth = new DateTime().getMonthOfYear();

使用ISO日歷系統和當前默認時區。 就我個人而言,我不太喜歡默認時區,因此您可能需要:

int currentMonth = new DateTime(DateTimeZone.UTC).getMonthOfYear();

我懷疑ISO日歷系統對您來說會很好:)

(正如ChssPly76所說, cal.get(Calendar.MONTH)將使用您當前的代碼為您提供基於0的月份號,但是我認為這是一個可怕的API。)

編輯:現在,您已經更新了問題,應該通過進一步分解來診斷問題。 就用戶輸入而言,還是與當月相比,這是一個問題嗎? 如果是“與當前月份比較”位,這很容易在一個簡短但完整的程序中顯示出來,該程序沒有其他所有內容:

import java.util.*;

public class Test
{
    public static void main(String[] args)
    {
        // It's currently November
        int userInput = 11;

        Calendar cal = Calendar.getInstance();
        int currentMonth = cal.get(Calendar.MONTH) + 1;

        if (userInput == currentMonth)
        {
            System.out.println("Yes, that's the current month");
        }
        else
        {
            System.out.println("No, the current month is " + currentMonth);
        }
    }
}

我使用0個月補償了java.util.Calendar方法是在返回的值上加上1而不是從用戶輸入中減去1,但這是相同的基本前提。

現在,如果要獲取用戶輸入是問題所在,則無需打擾當前月份-只需檢查您是否獲得了期望值即可。

許多編程基本上將一個問題分為兩部分。 這里有兩個問題:

  • 解析用戶輸入
  • 與當月比較

找出問題所在,然后編輯您的問題以解決該問題

你想要什么

cal.get(Calendar.MONTH)

這將返回您在一年中月份的從零開始的索引。

但是,您的問題尚不清楚,而且您的解析代碼似乎比必須的要復雜得多。 也許,如果您能更好地解釋您要做什么,那么有人將可以提出更好的方法。

這些 相關 問題來看,我認為您之前有很多問題。

您正在嘗試對已經使用現有庫進行編碼的內容進行編碼。 此冗余代碼導致沖突。

你可以

A)使用現有的庫。

B)自己編寫解決方案的代碼以供學習。

如果您選擇A,則只需要。

public Date toDate( String inStr ) {
    return new SimpleDateFormat("MM/dd").parse(inStr);
}

就是這樣!

如果您選擇B,首先需要創建一個算法(在紙張中)並描述解決問題所需的步驟。

喜歡

  • 拿弦
  • 用“ /”部分分割
  • 將它們轉換為數字
  • 驗證第一個數字是否在1到31之間
  • 驗證月份(分別在1和12中)
  • 如果月份為2,則日期必須小於29

等等等

一旦明確定義了所有這些步驟,就可以繼續進行編纂。 其中一些將無縫翻譯,而另一些則需要更多工作。 對於某些步驟,您可能創建的代碼雖然不盡如人意,但可以正常工作,而對於其他部分,您將一無所知。

但是,如果您沒有算法,就會一遍又一遍地碰壁。 並按照您描述的方式解決問題。

首先使用您自己的語言使它在論文中運行,然后找出如何編寫代碼。

這是一個相關的條目: 從問題傳遞到代碼的過程:您是如何學習的?

我同意其他答案; 如果分配允許您使用SimpleDateFormat進行分析。

您還可以使用Calendar類通過關閉對值的寬松解釋,然后設置字段,然后強制Calendar實例重新計算其內部計數器,來執行類似的操作。 如果字段值不一致,將引發異常。 像這樣:

import java.util.*;

public class Test {
    public static void main(String[] args) {
        Calendar c1=new GregorianCalendar();
        c1.setLenient(false);
        c1.set(2010,1,23);        // should work: Jan. 23, 2010
        c1.getTimeInMillis();     // will revalidate the calendar fields
        System.out.println("OK: "+c1.toString());
        try {
            c1.set(2010,2,35);     // invalid date: Feb. 35, 2010
            c1.getTimeInMillis();  // revalidate... should throw exception!
            System.out.println("OK: "+c1.toString()); // never happens
        } catch(IllegalArgumentException t) {
            System.out.println("FAIL: "+c1.toString());
            t.printStackTrace();
        }
    }
}

在這里,對getTimeInMillis()的調用將強制Calendar重新驗證其內部字段; 如果值與正常的日歷時間不一致(即超出范圍),則該調用將引發IllegalArgumentException。 如果您保留啟用默認值lenient = true,則第二次調用將成功,但是由於Calendar試圖弄清您的意思,因此您將在三月的一天結束!

唯一真正的難題是,要正確地進行這樣的計算,您必須知道年份是什么,以便Calendar可以為您進行year年計算,以使2月的天數正確。

如果由於某種原因您真的不關心這一年,則可以只對不屬於know年的年份進行硬編碼,例如2009年。請確保記錄您所做的事情很奇怪! 這有點駭人聽聞,並且通常表明您正在以一種不太理想的方式來做某事!

但是,正如其他答案中所述,SimpleDateFormat或一些基於數組的查找表可能是此處的簡單答案。

希望您能從中受益。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM