import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; /** * Class for calculating Modified Julian Day (MJD) numbers. * Proposed terminology: * * @see Julian day * @author Ronald Koster */ public abstract class MJD { public static void main(String[] args) { DateFormat df = new SimpleDateFormat("yyyyMMdd"); df.setLenient(false); Date date = new Date(); if (args != null && args.length > 0) { try { date = df.parse(args[0]); } catch (ParseException pex) { System.out.println("Invalid date: " + args[0]); System.exit(1); } } System.out.println("Date = " + df.format(date)); long mjd = calculateMJD(date); System.out.println("Modified Julian Day = MJD = " + mjd); System.out.println("MJD % 7 = " + mjd % 7); System.out.println("(MJD_Wednesday_18581117 = 0)"); } /** * @return Modified Julian Day (integer number) for given date. * NB. Default calendar (default time zone and locale) are used. */ public static long calculateMJD(Date date) { Calendar cal = Calendar.getInstance(); cal.set(1858, Calendar.NOVEMBER, 17, 0, 0, 0); cal.set(Calendar.MILLISECOND, 0); long utc0 = cal.getTimeInMillis(); long dstOffset0 = cal.get(Calendar.DST_OFFSET); cal.setTime(date); long utc1 = cal.getTimeInMillis(); long dstOffset1 = cal.get(Calendar.DST_OFFSET); // LT = LocalTime = UTC + TimeZoneOffset + DstOffset = UTC + TZ + D // Hence: LT1 - LT0 = UTC1 - UTC0 + D1 - D0 (since TZ1 = TZ0) long ms = utc1 - utc0 + dstOffset1 - dstOffset0; //System.out.println("ms: " + ms); // For debugging. return ms / (24L * 3600L * 1000L); } }