2012-04-27 104 views
1

我會從一個日期開始計算一年半個月的號碼。例如,我有2012年3月13日,我有6個結果。Java獲得半個月的號碼

我試着Calendar類,但不能正常工作:

Calendar cal = (GregorianCalendar) Calendar.getInstance(); 
    cal.set(Calendar.DAY_OF_MONTH,13); 
    cal.set(Calendar.MONTH, 2); 
    cal.set(Calendar.YEAR, 2012); 
    int weekNum = cal.get(Calendar.WEEK_OF_YEAR); 
    System.out.println("Weeknum:" + ((weekNum/2))); 

誰能幫助我?

+1

你期望什麼結果?什麼是「半周」? – 2012-04-27 12:47:56

+0

不應該你乘以2而不是lol – Snicolas 2012-04-27 12:48:08

+0

我想要6作爲結果,但我有5(半周是14天)。 – CeccoCQ 2012-04-27 12:49:42

回答

0
Calendar cal = (GregorianCalendar) Calendar.getInstance(); 
cal.set(Calendar.DAY_OF_MONTH,13); 
cal.set(Calendar.MONTH, 2); 
cal.set(Calendar.YEAR, 2012); 
int hafMonthCount = cal.get(Calendar.DAY_OF_YEAR)/14 ; 
//here you must multiply by 2 :) 
System.out.println("HalfMonthCount:" + hafMonthCount); 

---更新

當你使用不使用Java實現(在法國,我們有14天quizaine的這個概念,但英語我不能說)這個概念,你必須計算它由你自己。

+0

好的,但我仍然有5結果。 – CeccoCQ 2012-04-27 12:52:35

+1

您必須將1添加到hfMonthCount。 – CeccoCQ 2012-04-27 12:57:13

+0

或者可能使用DAY_OF_WEEK調整值。 – Snicolas 2012-04-27 13:24:43

2

假設這裏定義半個月:http://en.wikipedia.org/wiki/Half-month

Calendar cal = (GregorianCalendar) Calendar.getInstance(); 
    cal.set(Calendar.DAY_OF_MONTH, 13); 
    cal.set(Calendar.MONTH, 2); 
    cal.set(Calendar.YEAR, 2012); 
    // remember, we have a zero based month 
    int halfMonth = cal.get(Calendar.MONTH) * 2 + 1; 
    // 1-15 is first half-month 16-end of month is second 
    int remainder = cal.get(Calendar.DAY_OF_MONTH)/16; 
    halfMonth += remainder; 

    System.out.println(halfMonth); 
+0

這段代碼有點奇怪。你應該除以2,而不是當月的數字。由於示例日期位於2月份,所以這種情況很有效,但在任何其他月份都會失敗。 – Alderath 2012-05-02 11:46:06

+0

你是對的。一月是零,因此三月是2. – jarrad 2012-05-02 14:08:49

+0

我的壞。簡單地假設MONTH基於1,因爲DAY_OF_YEAR和WEEK_OF_YEAR都是1。我想知道在同一個API中混合基於0和基於1的變量的原因是什麼... – Alderath 2012-05-02 14:48:02

0

詳細舉例什麼用您的代碼恰好顯示。假設我們有WEEK_OF_YEAR以下四種不同的值:

WEEK_OF_YEAR: 1 
WEEK_OF_YEAR: 2 
WEEK_OF_YEAR: 3 
WEEK_OF_YEAR: 4 

如果我們除以2,這些數值會發生什麼?

WEEK_OF_YEAR: 1   (weekNum/2) = 1/2 = 0 
WEEK_OF_YEAR: 2   (weekNum/2) = 2/2 = 1 
WEEK_OF_YEAR: 3   (weekNum/2) = 3/2 = 1 
WEEK_OF_YEAR: 4   (weekNum/2) = 4/2 = 2 

所以你的代碼的問題是它會導致產生了值0年的第一個星期所以,你會想在你的代碼是做什麼的(weekNum/2)((weekNum + 1)/2)取代。

0

如果打算使用astronomy Half-Month(不要與astronomy fortnight混淆),那麼Answer by jarrad是正確的。但是現在我們有更多的現代類,即java.time類。

enter image description here

LocalDate

LocalDate類表示沒有時間一天和不同時區的日期,唯一的價值。

時區對確定日期至關重要。對於任何特定的時刻,日期因地區而異。例如,巴黎午夜過後的幾分鐘,法國是一個新的一天,而在魁北克蒙特利爾仍然是「昨天」。

ZoneId z = ZoneId.of("America/Montreal"); 
LocalDate ld = LocalDate.now(z); 

獲取月份編號,1-12月爲1月至12月。

int monthNumber = ld.getMonthValue(); // 1-12. 

將該月的數字乘以二,因爲每月有兩個半月。如果在本月初,減一(例如,6變爲5)。

int adjustment = (ld.getDayOfMonth() < 16) ? 1 : 0 ; // If first half of month, back off the half-month-number by 1. 
int halfMonthNumber = ((monthNumber * 2) - adjustment); // 1-24. 

的天文半月標記每一個英文字母,A - Y而省略I。所以我們用半個月的數字從24個字母的子集字母表中提取一封信。

int index = (halfMonthNumber - 1); // Subtract one for zero-based counting. 
String alphaCode = "ABCDEFGHJKLMNOPQRSTUVWXY".substring(index , index + 1); 

我還沒有運行該代碼,只是鍵入我的頭頂部。使用風險自負,如有需要請修復。

關於java.time

java.time框架是建立在Java 8和更高版本。這些課程取代了麻煩的舊日期時間課程,如java.util.Date,.Calendar,& java.text.SimpleDateFormat

Joda-Time項目,現在在maintenance mode,建議遷移java.time。請參閱Oracle Tutorial。並搜索堆棧溢出了很多例子和解釋。

大部分的java.time功能後移植到Java 6 和ThreeTenABP還適於Android(見How to use…)。

ThreeTen-Extra項目擴展java.time與其他類。這個項目是未來可能增加java.time的一個試驗場。你可以在這裏找到一些有用的類,如Interval,YearWeek,YearQuarter,等等。