/ftr-gwt-date-emulation/src/test/java/eu/future/earth/date/WeekCounter.java

http://ftr-gwt-library.googlecode.com/ · Java · 201 lines · 122 code · 27 blank · 52 comment · 21 complexity · 50895358b2bdc3fc3926258754b11a0b MD5 · raw file

  1. package eu.future.earth.date;
  2. import java.util.Calendar;
  3. import java.util.Date;
  4. import java.util.GregorianCalendar;
  5. public class WeekCounter {
  6. @SuppressWarnings("deprecation")
  7. public static int getWeekOfYear(final Date date, int firstDayOfWeek, int minDaysOfFirstWeek) {
  8. // log("De dag is" , date);
  9. final GregorianCalendar tester = new GregorianCalendar();
  10. tester.setFirstDayOfWeek(firstDayOfWeek);
  11. tester.setTime(date);
  12. tester.set(Calendar.DAY_OF_WEEK, firstDayOfWeek);
  13. Date firstOfWeekForDate = tester.getTime();
  14. // log("First Day of week" , firstOfWeekForDate);
  15. tester.add(Calendar.DATE, 7);
  16. Date laatsteDagOfWeekForDate = tester.getTime();
  17. // log("Laatste Dag of week" , laatsteDagOfWeekForDate);
  18. if(laatsteDagOfWeekForDate.getYear() != firstOfWeekForDate.getYear()){
  19. final Date firstDayOfNextYear = getFirstDateOfYear(laatsteDagOfWeekForDate.getYear());
  20. int weekOneDuration = compareDate(firstOfWeekForDate, firstDayOfNextYear);
  21. if((7 - minDaysOfFirstWeek) >= weekOneDuration){
  22. return 1;
  23. }
  24. }
  25. if (firstOfWeekForDate.getYear() != date.getYear()) {
  26. return getWeekOfYearNoPrev(firstOfWeekForDate, firstDayOfWeek, minDaysOfFirstWeek);
  27. }
  28. final Date firstDayOfYear = getFirstDateOfYear(date.getYear());
  29. tester.setTime(firstDayOfYear);
  30. tester.set(Calendar.DAY_OF_WEEK, firstDayOfWeek);
  31. // tester.set(Calendar.DATE, 7);
  32. final Date startOfWeekForFirstDayInYear = tester.getTime();
  33. // log("Start of first day in week of year", startOfWeekForFirstDayInYear);
  34. // Check the first week
  35. // if its shorter that the min skip it.
  36. int count = 1;
  37. Date startOfWeekForFirstWeekInYear = startOfWeekForFirstDayInYear;
  38. if (startOfWeekForFirstDayInYear.getYear() != firstDayOfYear.getYear()) {
  39. tester.setTime(startOfWeekForFirstWeekInYear);
  40. // log("Start of First Week", startOfWeekForFirstWeekInYear);
  41. int weekOneDuration = compareDate(startOfWeekForFirstWeekInYear, firstDayOfYear);
  42. if((minDaysOfFirstWeek) <= weekOneDuration){
  43. tester.add(Calendar.DATE, 7);
  44. startOfWeekForFirstWeekInYear = tester.getTime();
  45. }
  46. // log("Start of First Week", startOfWeekForFirstWeekInYear);
  47. }
  48. // log("Start of First Week", startOfWeekForFirstWeekInYear);
  49. // if (weekOneDuration <= minDaysOfFirstWeek) {
  50. // count--;
  51. // }
  52. int days = compareDate(startOfWeekForFirstWeekInYear, firstOfWeekForDate);
  53. System.out.println(days);
  54. while (days >= 7) {
  55. days = days - 7;
  56. count++;
  57. }
  58. if (count == 54) {
  59. count = 1;
  60. }
  61. if (count == 0) {
  62. count = 53;
  63. }
  64. return count;
  65. }
  66. @SuppressWarnings("deprecation")
  67. private static Date getFirstDateOfYear(int year){
  68. final Date firstDayOfYear = new Date(year, Calendar.JANUARY, 1);
  69. return firstDayOfYear;
  70. }
  71. @SuppressWarnings("deprecation")
  72. private static int getWeekOfYearNoPrev(final Date date, int firstDayOfWeek, int minDaysOfFirstWeek) {
  73. final Date firstDayOfYear = getFirstDateOfYear(date.getYear());
  74. final GregorianCalendar tester = new GregorianCalendar();
  75. tester.setFirstDayOfWeek(firstDayOfWeek);
  76. tester.setTime(firstDayOfYear);
  77. tester.set(Calendar.DAY_OF_WEEK, firstDayOfWeek);
  78. tester.setTime(firstDayOfYear);
  79. tester.set(Calendar.DAY_OF_WEEK, firstDayOfWeek);
  80. // tester.set(Calendar.DATE, 7);
  81. final Date startOfWeekForFirstDayInYear = tester.getTime();
  82. // log("Start of first day in week of year", startOfWeekForFirstDayInYear);
  83. // Check the first week
  84. // if its shorter that the min skip it.
  85. int count = 1;
  86. Date startOfWeekForFirstWeekInYear = startOfWeekForFirstDayInYear;
  87. if (startOfWeekForFirstDayInYear.getYear() != firstDayOfYear.getYear()) {
  88. tester.setTime(startOfWeekForFirstWeekInYear);
  89. // log("Start of First Week", startOfWeekForFirstWeekInYear);
  90. int weekOneDuration = compareDate(startOfWeekForFirstWeekInYear, firstDayOfYear);
  91. if((minDaysOfFirstWeek) <= weekOneDuration){
  92. tester.add(Calendar.DATE, 7);
  93. startOfWeekForFirstWeekInYear = tester.getTime();
  94. }
  95. // log("Start of First Week", startOfWeekForFirstWeekInYear);
  96. }
  97. // log("Start of First Week", startOfWeekForFirstWeekInYear);
  98. // if (weekOneDuration <= minDaysOfFirstWeek) {
  99. // count--;
  100. // }
  101. tester.setTime(date);
  102. tester.set(Calendar.DAY_OF_WEEK, firstDayOfWeek);
  103. Date firstOfWeekForDate = tester.getTime();
  104. int days = compareDate(startOfWeekForFirstWeekInYear, firstOfWeekForDate);
  105. System.out.println(days);
  106. while (days >= 7) {
  107. days = days - 7;
  108. count++;
  109. }
  110. if (count == 54) {
  111. count = 1;
  112. }
  113. if (count == 0) {
  114. count = 53;
  115. }
  116. return count;
  117. }
  118. // private static void log(String comment, Date theDate) {
  119. // SimpleDateFormat formatter = new SimpleDateFormat("EEEEE dd/MM/yyyy");
  120. // System.out.println(comment + " " + formatter.format(theDate));
  121. // }
  122. /**
  123. * Set hour, minutes, second and milliseconds to zero.
  124. *
  125. * @param d
  126. * Date
  127. * @return Modified date
  128. */
  129. @SuppressWarnings("deprecation")
  130. public static Date setHourToZero(Date in) {
  131. final Date d = new Date(in.getTime());
  132. d.setHours(0);
  133. d.setMinutes(0);
  134. d.setSeconds(0);
  135. // a trick to set milliseconds to zero
  136. long t = d.getTime() / 1000;
  137. t = t * 1000;
  138. return new Date(t);
  139. }
  140. /**
  141. * Calculate the number of days betwen two dates
  142. *
  143. * @param a
  144. * Date
  145. * @param b
  146. * Date
  147. * @return the difference in days betwen b and a (b - a)
  148. */
  149. public static int compareDate(Date a, Date b) {
  150. final Date ta = new Date(a.getTime());
  151. final Date tb = new Date(b.getTime());
  152. final long d1 = setHourToZero(ta).getTime();
  153. final long d2 = setHourToTen(tb).getTime();
  154. return (int) ((d2 - d1) / 1000 / 60 / 60 / 24);
  155. }
  156. /**
  157. * Set hour to 10, minutes, second and milliseconds to zero.
  158. *
  159. * @param d
  160. * Date
  161. * @return Modified date
  162. */
  163. @SuppressWarnings("deprecation")
  164. public static Date setHourToTen(Date in) {
  165. final Date d = new Date(in.getTime());
  166. d.setHours(10);
  167. d.setMinutes(0);
  168. d.setSeconds(0);
  169. // a trick to set milliseconds to zero
  170. long t = d.getTime() / 1000;
  171. t = t * 1000;
  172. return new Date(t);
  173. }
  174. }