
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()));
}
}


The Zmanim API did not have dedicated zmanim to claculate the Erev Pesach zmanim of sof zman achilas 