/** * C-Nery - A home automation web application for C-Bus. * Copyright (C) 2008,2009,2012 Dave Oxley <dave@daveoxley.co.uk>. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. * */ package com.daveoxley.cnery.util; import java.io.Serializable; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.GregorianCalendar; import java.util.TimeZone; import org.jboss.seam.annotations.In; import org.jboss.seam.annotations.Name; import uk.me.jstott.coordconv.LatitudeLongitude; import uk.me.jstott.sun.Time; import uk.me.jstott.util.JulianDateConverter; /** * * @author Dave Oxley <dave@daveoxley.co.uk> */ @Name("sun") public class Sun implements Serializable { @In private LatitudeLongitude position; public String getNextSunriseDisplay() { SimpleDateFormat formatter = new SimpleDateFormat("HH:mm:ss"); try { GregorianCalendar currentTime = new GregorianCalendar(); GregorianCalendar sunriseTime = nextSunrise(currentTime); String sunriseString = "Today at "; if (sunriseTime.get(Calendar.DAY_OF_YEAR) > currentTime.get(Calendar.DAY_OF_YEAR)) sunriseString = "Tomorrow at "; sunriseString += formatter.format(sunriseTime.getTime()); return sunriseString; } catch (Exception ex) { return "error"; } } public String getNextSunsetDisplay() { SimpleDateFormat formatter = new SimpleDateFormat("HH:mm:ss"); try { GregorianCalendar currentTime = new GregorianCalendar(); GregorianCalendar sunsetTime = nextSunset(currentTime); String sunsetString = "Today at "; if (sunsetTime.get(Calendar.DAY_OF_YEAR) > currentTime.get(Calendar.DAY_OF_YEAR)) sunsetString = "Tomorrow at "; sunsetString += formatter.format(sunsetTime.getTime()); return sunsetString; } catch (Exception ex) { return "error"; } } public GregorianCalendar nextSunrise(GregorianCalendar currentTime) { currentTime = (GregorianCalendar)currentTime.clone(); TimeZone currentTimezone = currentTime.getTimeZone(); boolean dst = currentTimezone.inDaylightTime(currentTime.getTime()); double currentJulian = JulianDateConverter.dateToJulian(currentTime); Time time = uk.me.jstott.sun.Sun.sunriseTime(currentJulian, position, currentTimezone, dst); GregorianCalendar sunriseTime = getGregorianCalendar(currentTime, time); if (!currentTime.after(sunriseTime)) return sunriseTime; currentTime.add(Calendar.DAY_OF_YEAR, 1); currentJulian = JulianDateConverter.dateToJulian(currentTime); time = uk.me.jstott.sun.Sun.sunriseTime(currentJulian, position, currentTimezone, dst); return getGregorianCalendar(currentTime, time); } public GregorianCalendar previousSunrise(GregorianCalendar currentTime) { currentTime = (GregorianCalendar)currentTime.clone(); TimeZone currentTimezone = currentTime.getTimeZone(); boolean dst = currentTimezone.inDaylightTime(currentTime.getTime()); double currentJulian = JulianDateConverter.dateToJulian(currentTime); Time time = uk.me.jstott.sun.Sun.sunriseTime(currentJulian, position, currentTimezone, dst); GregorianCalendar sunriseTime = getGregorianCalendar(currentTime, time); if (currentTime.after(sunriseTime)) return sunriseTime; currentTime.add(Calendar.DAY_OF_YEAR, -1); currentJulian = JulianDateConverter.dateToJulian(currentTime); time = uk.me.jstott.sun.Sun.sunriseTime(currentJulian, position, currentTimezone, dst); return getGregorianCalendar(currentTime, time); } public GregorianCalendar nextSunset(GregorianCalendar currentTime) { currentTime = (GregorianCalendar)currentTime.clone(); TimeZone currentTimezone = currentTime.getTimeZone(); boolean dst = currentTimezone.inDaylightTime(currentTime.getTime()); double currentJulian = JulianDateConverter.dateToJulian(currentTime); Time time = uk.me.jstott.sun.Sun.sunsetTime(currentJulian, position, currentTimezone, dst); GregorianCalendar sunsetTime = getGregorianCalendar(currentTime, time); if (!currentTime.after(sunsetTime)) return sunsetTime; currentTime.add(Calendar.DAY_OF_YEAR, 1); currentJulian = JulianDateConverter.dateToJulian(currentTime); time = uk.me.jstott.sun.Sun.sunsetTime(currentJulian, position, currentTimezone, dst); return getGregorianCalendar(currentTime, time); } public GregorianCalendar previousSunset(GregorianCalendar currentTime) { currentTime = (GregorianCalendar)currentTime.clone(); TimeZone currentTimezone = currentTime.getTimeZone(); boolean dst = currentTimezone.inDaylightTime(currentTime.getTime()); double currentJulian = JulianDateConverter.dateToJulian(currentTime); Time time = uk.me.jstott.sun.Sun.sunsetTime(currentJulian, position, currentTimezone, dst); GregorianCalendar sunsetTime = getGregorianCalendar(currentTime, time); if (currentTime.after(sunsetTime)) return sunsetTime; currentTime.add(Calendar.DAY_OF_YEAR, -1); currentJulian = JulianDateConverter.dateToJulian(currentTime); time = uk.me.jstott.sun.Sun.sunsetTime(currentJulian, position, currentTimezone, dst); return getGregorianCalendar(currentTime, time); } private GregorianCalendar getGregorianCalendar(GregorianCalendar gc, Time time) { gc = (GregorianCalendar)gc.clone(); gc.set(Calendar.HOUR_OF_DAY, time.getHours()); gc.set(Calendar.MINUTE, time.getMinutes()); int seconds = (int)Math.floor(time.getSeconds()); int ms = (int)Math.round(time.getSeconds() - seconds) * 1000; gc.set(Calendar.SECOND, seconds); // Set ms to 0 and add in case the rounding set ms to 1000ms gc.set(Calendar.MILLISECOND, 0); gc.add(Calendar.MILLISECOND, ms); return gc; } }