My reading of the documentation for DateList
and DateString
lead me to believe that both functions use $TimeZone
to determine the time zone to use in interpreting their inputs. Thus, for example, if the local machine time zone is UTC-5, $TimeZone
is -5
, and the time at Greenwich, corresponding to a given time in the local time zone can be found by specifying TimeZone -> 0
as an option:
DateList[{2012, 10, 8, 7}, TimeZone -> 0]
{2012, 10, 8, 12, 0, 0.}
DateString[{2012, 10, 8, 7}, TimeZone -> 0]
"Mon 8 Oct 2012 12:00:00"
To base these calculations off a different time zone, one should simply have to change the value of $TimeZone
, either temporarily, using Block
, or globally, by unprotecting and changing $TimeZone
. But neither of these approaches works as expected. Both behave as if the machine's time zone, and not $TimeZone
is being used to determine the local time zone:
Block[{$TimeZone = 0}, DateList[{2012, 10, 8, 7}, TimeZone -> 0]]
{2012, 10, 8, 12, 0, 0.}
Block[{$TimeZone = 0}, DateString[{2012, 10, 8, 7}, TimeZone -> 0]]
"Mon 8 Oct 2012 12:00:00"
(* Machine time zone is UTC-5 throughout; $TimeZone = 0 until changed below *)
Unprotect[$TimeZone]; $TimeZone = 0;
DateList[{2012, 10, 8, 7}, TimeZone -> 0]
{2012, 10, 8, 12, 0, 0.}
DateString[{2012, 10, 8, 7}, TimeZone -> 0]
"Mon 8 Oct 2012 12:00:00"
And even weirder:
DateList[{2012, 10, 8, 7}]
{2012, 10, 8, 7, 0, 0.}
DateList[{2012, 10, 8, 7}, TimeZone -> $TimeZone]
{2012, 10, 8, 12, 0, 0.}
And yet more timey-wimey:
AstronomicalData["Sun", {"RightAscension", {2012, 10, 8, 7}}]
12.958492
AstronomicalData["Sun", {"RightAscension", {2012, 10, 8, 7}}, TimeZone -> 0]
12.958492
AstronomicalData["Sun", {"RightAscension", {2012, 10, 8, 7}}, TimeZone -> $TimeZone]
12.958492
which all seems okay until1
Unprotect[$TimeZone]; $TimeZone = -5
AstronomicalData["Sun", {"RightAscension", {2012, 10, 8, 7}}]
12.958492
AstronomicalData["Sun", {"RightAscension", {2012, 10, 8, 7}}, TimeZone -> 0]
12.945765
AstronomicalData["Sun", {"RightAscension", {2012, 10, 8, 7}}, TimeZone -> $TimeZone]
12.958492
The second set of AstronomicalData
calculations (with $TimeZone = -5
, the machine time zone) is at least consistent with what DateList
and DateString
seem to be doing: input is interpreted as being in the machine time zone (regardless of $TimeZone
), unless a different time zone is specified using TimeZone
. But that seems to be precisely the problem: if the time zone specified with TimeZone
matches $TimeZone
, it's ignored, even if the machine time zone is different. So in the first set of AstronomicalData
calculations (with $TimeZone = 0
), when TimeZone
is '0' or $TimeZone
, the option is just ignored, and AstronomicalData
reports data for the default, machine time zone instead.
If $TimeZone
is merely the default setting for TimeZone
options and not the default time zones for executing time zone dependent functions, how do I get date and time functions to work in another time zone by default (without changing the machine's clock)?
1. I know the Sun's RA isn't the best value to use to spot differences over hour time scales, but since I can't get a straight answer from Wolfram (after 2 weeks of trying) about whether Mathematica ephemerides incorporate parallax or atmospheric effects, I wanted to be sure I had used something that would be immune to those effects when viewed from two different locations, since I don't specify those in the example.