Question:
Why does the output of zmanim for a different time zone appear incorrect?
Answer:
One of the common issues encountered by developers using the API is that zmanim generated for a different time zone than the user’s time zone may return output that appears incorrect. For example a user in Lakewood, NJ trying to calculate sunrise for Yerushalayim may attempt to use the following code:
String locationName = "Jerusalem"; double latitude = 31.778; // Har habayis double longitude = 35.2354;// Har Habayis double elevation = 0; TimeZone timeZone = TimeZone.getTimeZone("Asia/Jerusalem"); GeoLocation location = new GeoLocation(locationName, latitude, longitude, elevation, timeZone); ZmanimCalendar zc = new ZmanimCalendar(location); zc.getCalendar().set(2011, Calendar.FEBRUARY, 8); System.out.println("Sunrise: " + zc.getSunrise()); System.out.println("Sunset: " + zc.getSunset());
While you would expect a sunrise of 6:27:41 AM and sunset of 5:19:19 PM, running this code on a computer anywhere in the Eastern Standard time zone would generate the following time that appears to be 7 hours early:
Sunrise: Mon Feb 07 23:27:41 EST 2011 Sunset: Tue Feb 08 10:19:19 EST 2011
The issue is simple, and the sunrise and sunset returned above are actually accurate. Zmanim are returned by the Zmanim API as a Java Date object that represents a moment in time (stored internally by Java as Unix Time – the number of milliseconds since the January 1, 1970 GMT). Sunrise in Yerushalayim on February 8th actually happens at 11:27:41 PM on February 7th EST. Java is simply outputting the Date as a String formatted to the users default time zone (EST in this example). The user probably intends to output the time in IST – Israel Standard Time (“Asia/Jerusalem” in the Olson database). To do this you have to output the zmanim using a formatter set to use the “Asia/Jerusalem” time zone.
DateFormat zmanimFormat = new SimpleDateFormat("EEE MMM dd HH:mm:ss z yyyy"); zmanimFormat.setTimeZone(location.getTimeZone()); System.out.println("sunrise: " + zmanimFormat.format(zc.getSunrise())); System.out.println("sunset:" + zmanimFormat.format(zc.getSunset()));
will output the expected
sunrise: Tue Feb 08 06:27:41 IST 2011 sunset:Tue Feb 08 17:19:19 IST 2011
Below is the full code example.
import com.kosherjava.zmanim.*; import com.kosherjava.zmanim.util.*; import java.util.TimeZone; public class FormatZmanim{ public static void main(String [] args) { String locationName = "Jerusalem"; double latitude = 31.778; //latitude of Har habayis double longitude = 35.2354; //longitude of Har Habayis double elevation = 0; //optional elevation //use a Valid Olson Database timezone listed in java.util.TimeZone.getAvailableIDs() TimeZone timeZone = TimeZone.getTimeZone("Asia/Jerusalem"); //create the location object GeoLocation location = new GeoLocation(locationName, latitude, longitude, elevation, timeZone); ZmanimCalendar zc = new ZmanimCalendar(location); //create the ZmanimCalendar zc.getCalendar().set(2011, Calendar.FEBRUARY, 8); //set the date DateFormat zmanimFormat = new SimpleDateFormat("EEE MMM dd HH:mm:ss z yyyy"); //Create the formatter zmanimFormat.setTimeZone(location.getTimeZone()); //set the formatter's time zone System.out.println("sunrise: " + zmanimFormat.format(zc.getSunrise())); System.out.println("sunset:" + zmanimFormat.format(zc.getSunset())); } }