2012-07-13 62 views
0

可以說我有以毫秒爲單位或java.sql.Timestamp中的2個日期:週末的Java API計算器/庫

1342162320 <-> Fri Jul 13 2012 09:52:00 GMT+0300 (FLE Daylight Time) 
1343162320 <-> Tue Jul 24 2012 23:38:40 GMT+0300 (FLE Daylight Time) 

可以說,我提供這些2日,我需要:

返回INT ,如果從7月13日09:52至7月24日23:58之間的時間是週末或大假期,如果是的話,多少天。

我想過了所有的日期,並檢查它是星期六還是星期日,但也許更聰明的API?

我也看了一下Joda庫,但它並沒有專門的這些方法,只是有一些簡化的JDK。喬達沒有假日認可。

+0

假期?你是說世界上每個國家都有不同的變化?在同一個國家不同的宗教,他們的宗教節日不匹配。 – bezmax 2012-07-13 07:47:22

+0

@Max嗯,我的意思是像日曆中的紅色假日,只有大的。一種全球性的。 – Jaanus 2012-07-13 07:48:33

+0

看看http://stackoverflow.com/questions/1044921/a-good-business-calendar-library-in-java,這可能是你正在尋找的想法。 – 2012-07-13 07:49:19

回答

1

您可以使用http://www.calendarlabs.com/ical-calendar-holidays.php定義的假日日曆,它們可用於多個國家/地區。它的格式稱爲iCal,由MS Outlook使用。編寫該格式的解析器不應該很困難。然後你有'紅色'的日期,不必定義和更新,只需下載每年的新定義。

從Google日曆或類似日曆中獲取假日也是可能的。

0

是的,這是很容易的,只要按照下面的代碼:

Calendar cal = new GregorianCalendar(); 
    cal.setTime(date); 
    //cal.setTimeInMillis(milliseconds); use this one instead if you have milliseconds. 
    int dayOfWeek = cal.get(Calendar.DAY_OF_WEEK); 
    if(Calendar.SUNDAY == dayOfWeek || Calendar.SATURDAY == dayOfWeek){ 
     System.out.println("it is saturday or sunday") 
    } 

這可以識別出這一天是週六或週日,但如果你想以確定它是否是公共假日?例如:國定假日,我想說通過JDK可能是不可能的,因爲這是非常符合不同地區或國家的,這不是永久性的。

0

TL;博士

Boolean isWeekend = EnumSet.of(DayOfWeek.SATURDAY , DayOfWeek.SUNDAY).contains (Instant.ofEpochSecond(1342162320L).atZone(ZoneId.of("Europe/Helsinki")).getDayOfWeek()) 

詳細

其他的答案是正確的,但使用過時的遺留類。改用java.time類。

問題的週末部分很容易使用內置的Java庫。您可以定義一組週末的週末,如週日在美國的星期六&。

覆蓋假期需要某種外部庫,Web服務或數據庫。假日的定義隨着時間和管轄權和傳統而變化。我會忽略問題的這一部分;作爲一種可能的解決方案,請參閱Answer by Kennet

DayOfWeek

DayOfWeek枚舉標識每個七個星期幾。您可以詢問ZonedDateTimeDayOfWeek

首先解析你的輸入號碼。似乎是自1970年第一時間以UTC開始的整秒計數。注意L結束,使這個long整數。

Instant instant = Instant.ofEpochSecond(1342162320L); 

應用時區。

ZoneId zoneId = ZoneId.of("Europe/Helsinki"); 
ZonedDateTime zdt = instant.atZone(zoneId); 

通過詢問星期幾是星期六還是星期天來測試周末。

DayOfWeek dow = zdt.getDayOfWeek(); 
Boolean isWeekend = (dow.equals(DayOfWeek.SATURDAY) || dow.equals(DayOfWeek.SUNDAY)); 

EnumSet

你也可以使用一個EnumSet,快速執行和低內存佔用。

Set<DayOfWeek> weekend = EnumSet.of(DayOfWeek.SATURDAY , DayOfWeek.SUNDAY); 

聲明此爲static final常數如果定義不你的應用程序的執行過程中發生改變。

static final Set<DayOfWeek> WEEKEND = EnumSet.of(DayOfWeek.SATURDAY , DayOfWeek.SUNDAY); 

當你得到一個DayOfWeek對象,看它是否包含在EnumSet這是Set接口的實現。

Boolean isWeekend = WEEKEND.contains(dow.getDayOfWeek()); 

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

ThreeTen-Extra項目擴展java.time與其他類。這個項目是未來可能增加java.time的一個試驗場。