【问题标题】:Java Checking number monthsJava 检查数字月份
【发布时间】:2009-11-27 17:24:15
【问题描述】:

我想我想知道我想问什么问题我不想得到(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 个月被认为无效,有人知道为什么吗?我想不通。

【问题讨论】:

  • 问题是什么,你想达到什么目标?
  • @daddycardona:如果您在源代码之外提出问题,则更容易阅读您遇到的问题。也就是说,避免使用源代码 cmets 在这里提问——大多数人会错过这个问题。
  • 您问了一个较早的问题 (stackoverflow.com/questions/1809420/in-java-void-method-calling) 并得到了许多有用的答复以及格式化代码的建议。我建议你格式化代码,然后问一个明确的问题。
  • 好吧,抱歉,我知道它不能编译
  • @daddycardona:另外,请务必发布您看到的任何错误消息。并接受人们提供的正确答案。如果您不接受答案,人们将来会不太愿意帮助您。

标签: java calendar


【解决方案1】:

自己解析日期和时间是个坏主意 - 就像使用 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,方法是在返回的值上加一而不是从用户输入中减去一,但这是相同的基本前提。

现在,如果问题在于获取用户输入,您无需担心当前月份 - 只需检查您是否得到了预期的结果。

很多编程基本上是把一个问题分成两部分。这里有两个问题:

  • 解析用户输入
  • 与当月比较

找出哪一个是问题,然后编辑您的问题以解决这方面的问题

【讨论】:

  • Apache commons lang 也可以用于某些任务。在实现某些东西之前查看 apache commons 通常是一个好主意:)
  • @extraneon:说到日期和时间 API,我只看 Joda Time。我似乎记得不久前看过 apache commons 日期和时间库,并没有留下深刻的印象。
  • 我是这方面的大菜鸟,大学需要它,所以感谢大家的帮助,我希望我能让我的问题更容易让所有人理解。
  • 我想我知道我想问什么问题我不想要 getMONTH 我希望这个月不大于上一个日历月,这就是我做月 -1 的原因,我意识到如果我使用 get(calendar.MONTH) 它正在进入 11 月,我只想查看检查并确保它不大于 12 月对我们 12 到计算机 11。这就是为什么每隔一个月是无效的是我想要回答的问题
  • @daddycardona:恐怕我还是不明白你想要达到什么目的。我认为这里的问题不在于计算,而在于通信。慢下来,用适当的标点和大写写完整的句子。之后阅读您的文字,并考虑您是否理解它,没有其他背景信息。
【解决方案2】:

猜测你想要的是什么

cal.get(Calendar.MONTH)

这将返回一年内从零开始的月份索引。

但是,您的问题非常不清楚,而且您的解析代码似乎比它必须的要复杂一些。也许如果你能更好地解释你想要做什么,有人会提出更好的方法。

【讨论】:

  • 那是准确的,但是当我使用这个时,其他月份都无效
【解决方案3】:

theserelatedquestions来看,我认为在此之前你有很多问题。

您正在尝试编写已经使用现有库编码的内容。此冗余代码导致冲突。

你可以

A) 使用现有库。

B) 自己编写解决方案以供学习。

如果你选择 A,你只需要。

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

就是这样!

如果您选择 B,您需要首先创建一个算法(在纸页中)并描述解决问题需要哪些步骤。

喜欢

  • 取字符串
  • 用“/”部分分割
  • 将它们转换为数字
  • 验证第一个数字是否在 1 到 31 之间
  • 验证月份(在 1 和 12 中)
  • 如果月份是 2,那么天必须是

等 ETC 等

一旦您清楚地定义了所有这些步骤,您就可以继续进行编纂。其中一些将无缝翻译,而另一些则需要更多工作。对于某些步骤,您可能会创建不如预期的代码,但它可以工作,而对于其他部分,您将一无所知。

但是,如果您没有算法,您将一遍又一遍地碰壁。并遇到您所描述的问题。

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

这是一个相关条目:Process to pass from problem to code: How did you learn?

【讨论】:

  • 奥斯卡,你回答了我所有的问题,你真棒,谢谢伙计。我也有,但不如你的好,哈哈
  • :) 您知道您可以随时单击该勾号将答案标记为已接受;)(如果它确实解决了您的问题)
【解决方案4】:

我同意其他答案;如果分配允许,请使用 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 可以为您计算闰年,从而得到正确的 2 月天数。

如果出于某种原因你真的不关心年份,你可以硬编码一个你知道不是闰年的年份......比如 2009 年。一定要记录下来不过,您正在做一些奇怪的事情!这有点像 hack,这通常表明您正在以一种不太理想的方式做某事!

但是,正如其他答案中提到的,SimpleDateFormat 或基于数组的小查找表可能是这里简单明了的答案。

希望你觉得这很有教育意义。

【讨论】:

    猜你喜欢
    • 2016-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-08
    • 2021-12-02
    • 2014-03-30
    • 1970-01-01
    相关资源
    最近更新 更多