【问题标题】:Finding day of the year寻找一年中的一天
【发布时间】:2014-05-21 20:02:54
【问题描述】:

我正在尝试在您输入日期后查找一年中的哪一天。我有一种可行的方法,但这并不是最好的方法。

我使用 Scanner 对象询问日期,然后将其发送到一个方法,在该方法中检查它是一年中的哪一天。

public static int theDay(int month, int day, int year)
{
    int numDay = day;

    /* Code here to check for leap year */

    for(int i = 1; i < month; i++)
    {
        switch(i)
        {
           case 1:
             numDay += 31;
             break;
           case 2:
             numDay += 28;
             break;
           case 3:
             numDay += 31;
             break;
           ...
           ... //goes until case 12
           ...
        }
    }

    return numDay;
}

我无法使用日历、LocalDate、数组以及我的老师尚未教给我们的任何东西。所以我相信只有循环就可以了。如前所述,这行得通,我得到了正确的一天。但是,这样做的更好方法是什么?任何帮助,将不胜感激。谢谢!

【问题讨论】:

  • 您使用的是什么版本的 Java?

标签: java


【解决方案1】:

取决于你使用的是什么:

Java 8 之前的标准 Java 库

Calendar calendar = new GregorianCalendar();
// Just to avoid corner cases
calendar.setTimeZone(TimeZone.getTimeZone("Etc/UTC"));
calendar.set(year, month - 1, day);
int dayOfYear = calendar.get(Calendar.DAY_OF_YEAR);

乔达时间

LocalDate date = new LocalDate(year, month, day);
int dayOfYear = date.getDayOfYear();

Java 8,使用java.time

LocalDate date = LocalDate.of(year, month, day);
int dayOfYear = date.getDayOfYear();

自己编写代码

(现在我们知道这是您需要做的。)

如果您确实需要自己执行此操作,您当前的方法是可以的。你可以在没有循环的情况下做到这一点:

int daysInFebruary = ...; // Leap year calculation

switch (month)
{
    case 1:
        break; // Nothing to do
    case 2:
        numDay += 31; // Just add January
        break;
    case 3:
        numDay += 31 + daysInFebruary; // Add January and February
        break;
    case 4:
        numDay += 31 + daysInFebruary + 31; // Add January to March
        break;
    case 5:
        numDay += 31 + daysInFebruary + 31 + 30; // Add January to April
        break;
    // etc
    default:
        throw new IllegalArgumentException("Invalid month: " + month);
}

这样更有效,但我认为它的可读性不如您已经获得的代码。

用一个数组来做这件事会干净,请注意 - 你可以有一个包含每个月长度的数组,另一个包含每个月的累积长度 (0, 31 , 59 等)。添加闰年的特殊情况,鲍勃是你的叔叔。但是如果你不允许使用数组...

【讨论】:

  • 我不能使用 Calendar 或 LocalDate 因为我的老师不希望我们使用任何我们还没有学过的东西。也没有数组。
  • @yayu:我认为您应该在问题中指定这一点
  • @yayu:你没想到在问题中提到这一点?显而易见的答案是“不要重新发明轮子”......如果你想要其他的东西,你应该这么说。
  • 关于你的新答案,我一开始也是这样。不幸的是,我的老师没有接受它,因为这不是最好的方法。我问他到底想要什么,但没有给出任何线索。我没有提到它,因为我认为它并不比我发布的更好。
  • @yayu:再说一次,你没想到要提这个?鉴于您不能以“最佳”方式(即根本不自己编写逻辑)并且您对“最佳”方式没有任何要求,我建议您停止.你有工作代码,它是相当可读的(尽管你不需要案例 12)。如果你的老师不接受,也没有给你明确的理由,那么有错的是你的老师,而不是你。
猜你喜欢
  • 1970-01-01
  • 2010-12-23
  • 2021-01-28
  • 1970-01-01
  • 2020-08-31
  • 1970-01-01
  • 2012-01-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多