[英]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,首先需要創建一個算法(在紙張中)並描述解決問題所需的步驟。
喜歡
等等等
一旦明確定義了所有這些步驟,就可以繼續進行編纂。 其中一些將無縫翻譯,而另一些則需要更多工作。 對於某些步驟,您可能創建的代碼雖然不盡如人意,但可以正常工作,而對於其他部分,您將一無所知。
但是,如果您沒有算法,就會一遍又一遍地碰壁。 並按照您描述的方式解決問題。
首先使用您自己的語言使它在論文中運行,然后找出如何編寫代碼。
這是一個相關的條目: 從問題傳遞到代碼的過程:您是如何學習的?
我同意其他答案; 如果分配允許您使用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.