/*******************************************************************************
* Copyright (c) Emil Crumhorn - Hexapixel.com - emil.crumhorn@gmail.com
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* emil.crumhorn@gmail.com - initial API and implementation
*******************************************************************************/
package com.hexapixel.widgets.generic;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.Locale;
public class DateHelper {
private static final long MILLISECONDS_IN_DAY = 24 * 60 * 60 * 1000;
public static long daysBetween(Calendar start, Calendar end) {
// create copies
GregorianCalendar startDate = new GregorianCalendar(Locale.getDefault());
GregorianCalendar endDate = new GregorianCalendar(Locale.getDefault());
// switch calendars to pure Julian mode for correct day-between calculation, from the Java API:
// - To obtain a pure Julian calendar, set the change date to Date(Long.MAX_VALUE).
startDate.setGregorianChange(new Date(Long.MAX_VALUE));
endDate.setGregorianChange(new Date(Long.MAX_VALUE));
// set them
startDate.setTime(start.getTime());
endDate.setTime(end.getTime());
// force times to be exactly the same
startDate.set(Calendar.HOUR_OF_DAY, 12);
endDate.set(Calendar.HOUR_OF_DAY, 12);
startDate.set(Calendar.MINUTE, 0);
endDate.set(Calendar.MINUTE, 0);
startDate.set(Calendar.SECOND, 0);
endDate.set(Calendar.SECOND, 0);
startDate.set(Calendar.MILLISECOND, 0);
endDate.set(Calendar.MILLISECOND, 0);
// now we should be able to do a "safe" millisecond/day caluclation to get the number of days
long endMilli = endDate.getTimeInMillis();
long startMilli = startDate.getTimeInMillis();
// calculate # of days, finally
long diff = (endMilli - startMilli) / MILLISECONDS_IN_DAY;
return diff;
}
public static long daysBetween(Date start, Date end) {
Calendar dEnd = Calendar.getInstance(Locale.getDefault());
Calendar dStart = Calendar.getInstance(Locale.getDefault());
dEnd.setTime(end);
dStart.setTime(start);
return daysBetween(dStart, dEnd);
}
public static boolean isToday(Date date) {
Calendar cal = Calendar.getInstance();
cal.setTime(date);
return isToday(cal);
}
public static boolean isToday(Calendar cal) {
Calendar today = Calendar.getInstance();
if (today.get(Calendar.YEAR) == cal.get(Calendar.YEAR)) {
if (today.get(Calendar.DAY_OF_YEAR) == cal.get(Calendar.DAY_OF_YEAR)) {
return true;
}
}
return false;
}
/**
* Converts a date to Julian date. Used for date differentials.
* See http://scienceworld.wolfram.com/astronomy/JulianDate.html for super-mess.
*
* @param date Date to convert
* @return Julian date in double
*/
public static double toJulian(Date date) {
GregorianCalendar gc = new GregorianCalendar();
gc.setTime(date);
gc.set(Calendar.HOUR, 0);
gc.set(Calendar.MINUTE, 0);
gc.set(Calendar.SECOND, 0);
gc.set(Calendar.MILLISECOND, 0);
int year = gc.get(Calendar.YEAR);
int month = gc.get(Calendar.MONTH);
month += 1; // julian is not zero based
int day = gc.get(Calendar.DATE);
return toJulian(year, month, day, 0, 0, 0);
}
// from http://www.koders.com/java/fidD951168ECB41F635425E554A6771D4DBC4C3E29B.aspx
// only one I found that actually calculates it correctly
private static double toJulian(int year, int month, int day, int hour, int min, int sec) {
int y = year;
int m = month;
double timeofday;
int ijulian;
int IGREG = 15 + 31 * (10 + 12 * 1582); // 10/15/1582
int adj;
if (y < 0) y = y + 1;
if (m > 2) {
m = m + 1;
} else {
y = y - 1;
m = m + 13;
}
ijulian = (int) (365.25 * y) + (int) (30.6001 * m) + day + 1720995;
if (day + 31 * (m + 12 * y) >= IGREG) { // change for Gregorian calendar
adj = y / 100;
ijulian = ijulian + 2 - adj + adj / 4;
}
timeofday = hour / 24.0 + min / 1440.0 + sec / 86400.0;
return ijulian + timeofday;
}
public static String getDate(Calendar cal, String dateFormat) {
Calendar toUse = (Calendar) cal.clone();
toUse.add(Calendar.MONTH, -1);
SimpleDateFormat df = new SimpleDateFormat(dateFormat);
df.setLenient(true);
return df.format(cal.getTime());
}
public static boolean sameDate(Date date1, Date date2) {
Calendar cal1 = Calendar.getInstance();
Calendar cal2 = Calendar.getInstance();
cal1.setTime(date1);
cal2.setTime(date2);
return sameDate(cal1, cal2);
}
public static boolean sameDate(Calendar cal1, Calendar cal2) {
if (cal1.get(Calendar.YEAR) == cal2.get(Calendar.YEAR)) {
if (cal1.get(Calendar.DAY_OF_YEAR) == cal2.get(Calendar.DAY_OF_YEAR)) {
return true;
}
}
return false;
}
public static Date getDate(String str, String dateFormat) throws Exception
{
SimpleDateFormat df = new SimpleDateFormat(dateFormat);
df.setLenient(false);
return df.parse(str);
}
public static String getFormattedDate(Date date, String dateFormat)
{
SimpleDateFormat df = new SimpleDateFormat(dateFormat);
df.setLenient(true);
return df.format(date);
}
}