Java检查数月

时间:2009-11-27 17:24:16

标签: java calendar

我想我弄清楚我想问的问题我不想得到(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个月被认为没有任何人知道为什么?我无法理解。

4 个答案:

答案 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,你需要首先创建一个算法(在纸张中)并描述解决问题所需的步骤。

喜欢

  • 取字符串
  • 将其部分拆分为“/”
  • 将它们转换为数字
  • 验证第一个数字是否介于1到31之间
  • 验证月份(在1和12中)
  • 如果月份为2,则该日期必须为< 29

等 等等 等

一旦你明确了所有这些步骤,你就可以继续编纂。其中一些将无缝翻译,另一些则需要更多工作。对于某些步骤,您可能会创建不尽如人意的代码,但它可以工作,而对于其他部分,您将无法获得线索。

但如果你没有算法,你就会一遍又一遍地撞墙。并且正如您所描述的那样遇到问题。

首先让它以你自己的语言在论文中运行,然后找出如何编码它。

以下是相关条目: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或基于数组的小型查找表可能是这里简单明了的答案。

希望你能发现这种教育。