new object $world_time: $foundation;
var $root created_on = 848446570;
var $root flags = ['variables, 'methods, 'code, 'core];
var $root inited = 1;
var $root managed = [$world_time];
var $root manager = $world_time;
var $world_time speedup = 1;
var $world_time start_time = 0;
var $world_time time_units = [[31536000, "year", "years", "yr", "yrs"], [2592000, "month", "months", "mo", "mos"], [604800, "week", "weeks", "wk", "wks"], [86400, "day", "days", "dy", "dys"], [3600, "hour", "hours", "hr", "hrs"], [60, "minute", "minutes", "min", "mins"], [1, "second", "seconds", "sec", "secs"]];
var $world_time zone_offset = 0;
public method .current_season() {
var t;
// This is not very flexible, but works well enough. Note that southern
// hemisphere needs another object, with opposite seasons.
return ["spring", "summer", "fall", "winter"][(((.local_time()) / 172800) % 4) + 1];
};
public method .daytime() {
arg zone, dayscale;
var t, t1, t2;
t = (((.local_time()) / 3600) + zone) % 24;
t1 = 6 - dayscale;
t2 = 18 + dayscale;
switch (t) {
case 0 .. 2:
return [t, 'night, 'night];
case 3 .. t1 - 1:
return [t, 'predawn, 'night];
case t1:
return [t, 'dawn, 'day];
case t1 + 1 .. 11:
return [t, 'morning, 'day];
case 12:
return [t, 'noon, 'day];
case 13 .. t2 - 1:
return [t, 'afternoon, 'day];
case t2:
return [t, 'sunset, 'day];
case t2 + 1 .. 22:
return [t, 'evening, 'night];
case 23:
return [t, 'night, 'night];
}
};
public method .from_english() {
arg string, @units;
var words, len, nsec, n, i, entry, unit;
[(units ?= time_units)] = units;
words = string.explode();
words = words.setremove_all(["and"]);
if (listlen(words) == 1) {
if (!(words = regexp(words[1], "^([0-9]+)(.*)$")))
throw(~args, "Invalid time.");
}
len = listlen(words);
if (len % 2)
throw(~args, "Invalid time.");
nsec = (n = 0);
for i in [1 .. len] {
if ((i % 2) == 1) {
if ((words[i]).is_numeric())
n = (words[i]).to_number();
else if ((words[i]) in ["a", "an"])
n = 1;
else if ((words[i]) == "no")
n = 0;
else
throw(~invarg, "Invalid time.");
} else {
unit = words[i];
unit = unit.strip(",");
nsec += (> (units[.parse_unit(unit, units)])[1] <) * n;
}
}
return nsec;
};
public method .from_unit_list() {
arg time, ulist;
var t, s, i;
s = [];
for i in (ulist) {
t = time / ((time_units[i])[1]);
if (t)
s += [((t + " ") + ((time_units[i])[2])) + (t ? "s" : "")];
time = time % ((time_units[i])[1]);
}
return s.to_english();
};
public method .local_time() {
return (time() - start_time) * speedup;
};
public method .parse_unit() {
arg unit, @units;
var i;
[(units ?= time_units)] = units;
return find i in [1 .. units.length()] where (unit in ((units[i]).subrange(2))) || throw(~invarg, "Invalid time.");
};
public method .time_units() {
return time_units;
};