我想我弄清楚我想问的问题我不想得到(Calendar.MONTH)我希望月份不要大于最后一个月份,这就是为什么我在做-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个月被认为没有任何人知道为什么?我无法理解。
答案 0 :(得分:4)
自己解析日期和时间是一个坏主意 - 就像使用Java的内置功能一样。
我无法确切地说出你想做什么或出了什么问题,但我认为使用Joda Time是个好主意是可以接受的。
然后,不是使用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 :(得分:3)
我猜测你想要的是什么
cal.get(Calendar.MONTH)
将在一年内返回从零开始的月份索引。
然而,你的问题很不清楚,你的解析代码似乎比它必须要多一些。也许如果你更好地解释了你想要做的事情,那么有人就可以提出更好的方法。
答案 2 :(得分:2)
根据these related questions判断,我认为您之前遇到了一些问题。
您正在尝试编写已使用现有库编码的内容。这个冗余代码导致冲突。
你可以
A)使用现有的库。
B)自己编写解决方案以便学习。
如果你选择A,你只需要。
public Date toDate( String inStr ) {
return new SimpleDateFormat("MM/dd").parse(inStr);
}
就是这样!
如果你选择B,你需要首先创建一个算法(在纸张中)并描述解决问题所需的步骤。
喜欢
等 等等 等
一旦你明确了所有这些步骤,你就可以继续编纂。其中一些将无缝翻译,另一些则需要更多工作。对于某些步骤,您可能会创建不尽如人意的代码,但它可以工作,而对于其他部分,您将无法获得线索。
但如果你没有算法,你就会一遍又一遍地撞墙。并且正如您所描述的那样遇到问题。
首先让它以你自己的语言在论文中运行,然后找出如何编码它。
以下是相关条目:Process to pass from problem to code: How did you learn?
答案 3 :(得分:0)
我同意其他答案;如果赋值允许,请使用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尝试找出您的意思时,您最终会在3月份结束一天!
唯一真正的问题是要正确地进行这样的计算,你必须知道年份是什么,以便日历可以为你做闰年计算,以使2月份的天数正确。
如果由于某种原因你真的不关心这一年,你可以硬编码你知道不是闰年的一年...就像2009年一样。一定要记录下来你这样做的东西很奇怪!这有点像黑客攻击,这通常表明你以不太理想的方式做某事!
但是,正如其他答案中所提到的,SimpleDateFormat或基于数组的小型查找表可能是这里简单明了的答案。
希望你能发现这种教育。