2014-10-01 100 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