2014-10-01 61 views
0

我试图计算给定年份和月份编号的月份中的天数。这是我到目前为止。计算没有日历的月份中的天数

public static int daysInMonth(int m, int y) { 
    int d; 
    if (m == 1 || m == 3 || m == 5 || m == 7 
      || m == 8 || m == 10 || m == 12) { 
     d = 31; 
    } else if (m == 4 || m == 6 || m == 9 || m == 11) { 
     d = 30; 
    } else if (y % 4 == 0 && m == 2) { 
     d = 29; 
    } else if (m == 2) { 
     d = 28; 
    } else {  
     d = 0;  
    } 
    return d; 
    } 

不幸的是,它不正确的闰年第二个月工作。

如何在不使用Calendar类的情况下修复它?

+0

哪一个确切失败? – gtgaxiola 2014-10-01 17:06:59

+0

那么你的问题到底是什么?如果你只是想让你的代码看起来更好或者更有效率运行,你应该在http://codereview.stackexchange.com/ – 2014-10-01 17:07:28

+0

上提出这个问题。如果你只需要找出任何一个月有多少天的答案,已经有一个解决方案[这里](http://stackoverflow.com/questions/8940438/number-of-days-in-particular-month-of-particular-year) – 2014-10-01 17:09:39

回答

0

我会在每月的天存储在一个整数数组与第一指数为空值,以减少条件语句

public static int daysInMonth(int m, int y) { 
    int[] days = {0, 31, 28, 31, ... 31}; 
    if (m == 2 && y % 4 == 0) { 
     return 29; 

    } else { 
     return days[m]; 
    } 

}

你可能会想增加一些检查,以确保参数m总是小于13(月数加在一开始空值)

1

http://ideone.com/H4VAvv

w ^如果你的情况是2,2016,则产出如预期。

/* package whatever; // don't place package name! */ 

import java.util.*; 
import java.lang.*; 
import java.io.*; 

/* Name of the class has to be "Main" only if the class is public. */ 
class Ideone 
{ 
public static void main (String[] args) throws java.lang.Exception 
{ 
    System.out.println(daysInMonth(2,2016)); 
} 
public static int daysInMonth(int m, int y) { 
int d; 
if (m == 1 || m == 3 || m == 5 || m == 7 
     || m == 8 || m == 10 || m == 12) { 
    d = 31; 
} else if (m == 4 || m == 6 || m == 9 || m == 11) { 
    d = 30; 
} else if (y % 4 == 0 && m == 2) { 
    d = 29; 
} else if (m == 2) { 
    d = 28; 
} else {  
    d = 0;  
} 
return d; 
} 
} 
+0

同意,2016年2月没有发现问题。按照预期,您的方法正在返回29天。 – rajah9 2014-10-01 20:03:57

2

您需要正确计算闰年:

public static int daysInMonth(int m, int y) { 
    int d; 
    if (m == 1 || m == 3 || m == 5 || m == 7 
      || m == 8 || m == 10 || m == 12) { 
     d = 31; 
    } else if (m == 4 || m == 6 || m == 9 || m == 11) { 
     d = 30; 
    } else if (isLeapYear(y) && m == 2) { 
     d = 29; 
    } else if (m == 2) { 
     d = 28; 
    } else { 
     d = 0; 
    } 
    return d; 
} 

public static boolean isLeapYear(int year) { 
    if (year % 4 != 0) { 
    return false; 
    } else if (year % 400 == 0) { 
    return true; 
    } else if (year % 100 == 0) { 
    return false; 
    } else { 
    return true; 
    } 
} 

here

这是一个完整的,经过测试的解决方案,也有一个Ideone

import java.util.HashSet; 
import java.util.Arrays; 
import java.util.List; 

class MyClass { 

    public static void main(String[] args) { 
    List<Integer> leapYears = Arrays.asList(1804, 1808, 1812, 1816, 1820, 1824, 1828, 1832, 1836, 1840, 1844, 1848, 1852, 1856, 1860, 1864, 1868, 1872, 1876, 1880, 1884, 1888, 1892, 1896, 1904, 1908, 1912, 1916, 1920, 1924, 1928, 1932, 1936, 1940, 1944, 1948, 1952, 1956, 1960, 1964, 1968, 1972, 1976, 1980, 1984, 1988, 1992, 1996, 2000, 2004, 2008, 2012, 2016, 2020, 2024, 2028, 2032, 2036, 2040, 2044, 2048, 2052, 2056, 2060, 2064, 2068, 2072, 2076, 2080, 2084, 2088, 2092, 2096, 2104, 2108, 2112, 2116, 2120, 2124, 2128, 2132, 2136, 2140, 2144, 2148, 2152, 2156, 2160, 2164, 2168, 2172, 2176, 2180, 2184, 2188, 2192, 2196, 2204, 2208, 2212, 2216, 2220, 2224, 2228, 2232, 2236, 2240, 2244, 2248, 2252, 2256, 2260, 2264, 2268, 2272, 2276, 2280, 2284, 2288, 2292, 2296, 2304, 2308, 2312, 2316, 2320, 2324, 2328, 2332, 2336, 2340, 2344, 2348, 2352, 2356, 2360, 2364, 2368, 2372, 2376, 2380, 2384, 2388, 2392, 2396, 2400); 
    for(Integer year = 1804; year < 2400; year++) { 
     for(Integer month : Arrays.asList(1,3,5,7,8,10,12)) { 
     assert daysInMonth(month, year) == 31; 
     } 
     for(Integer month : Arrays.asList(4,6,9,11)) { 
     assert daysInMonth(month, year) == 30; 
     } 
     if(leapYears.contains(year)) { 
     assert daysInMonth(2, year) == 29; 
     } 
     else { 
     assert daysInMonth(2, year) == 28; 
     } 
    } 
    } 

    public static int daysInMonth(int m, int y) { 
    HashSet<Integer> monthsWith31Days = new HashSet<Integer>(Arrays.asList(1,3,5,7,8,10,12)); 
    HashSet<Integer> monthsWith30Days = new HashSet<Integer>(Arrays.asList(4,6,9,11)); 

    if(monthsWith31Days.contains(m)) { 
     return 31; 
    } else if(monthsWith30Days.contains(m)) { 
     return 30; 
    } 
    else if(isLeapYear(y)) { 
     return 29; 
    } 
    else { 
     return 28; 
    } 
    } 

    public static boolean isLeapYear(int year) { 
    if (year % 4 != 0) { 
     return false; 
    } else if (year % 400 == 0) { 
     return true; 
    } else if (year % 100 == 0) { 
     return false; 
    } else { 
     return true; 
    } 
    } 
} 
0

而且,为了保持一致性的缘故,再利用Date.isLeapYeardaysInMonth,而不是硬编码y % 4 == 0