diff --git a/lib/modules/Calendar.pmod/YMD.pike b/lib/modules/Calendar.pmod/YMD.pike index 402e6225612226cc4a8c53733f81e9e13b0ad704..d3f255523d72a7c7d0e6a56c509da646bac1c0fb 100644 --- a/lib/modules/Calendar.pmod/YMD.pike +++ b/lib/modules/Calendar.pmod/YMD.pike @@ -2814,45 +2814,50 @@ protected TimeRange dwim_zone(TimeRange origin,string zonename, { if (zonename=="") return 0; - if (zonename[0]=='"') sscanf(zonename,"\"%s\"",zonename); - sscanf(zonename,"%*[ \t]%s",zonename); - - if(sizeof(zonename)==4 && zonename[2]=='S') - zonename = zonename[0..1] + zonename[3..3]; - else if(sizeof(zonename)>4 && has_suffix(zonename, "DST")) - zonename = zonename[..<3]; - - if (origin->rules->abbr2zone[zonename]) - zonename=origin->rules->abbr2zone[zonename]; - - Calendar.Rule.Timezone zone=Calendar.Timezone[zonename]; - if (!zone) - { - if (sscanf(zonename,"%[^+-]%s",string a,string b)==2 && a!="" && b!="") - { - TimeRange tr=dwim_zone(origin,a,whut,@args); - if (!tr) return 0; - - return - dwim_tod(origin->set_timezone( - Calendar.Timezone.make_new_timezone( - tr->timezone(), - Calendar.Timezone.decode_timeskew(b))), - whut,@args); - } - if(!abbr2zones) - abbr2zones = master()->resolv("Calendar")["TZnames"]["abbr2zones"]; - array pz=abbr2zones[zonename]; - if (!pz) return 0; - foreach (pz,string zn) - { - TimeRange try=dwim_zone(origin,zn,whut,@args); - if (try && try->tzname()==zonename) return try; - } - return 0; - } - else - return dwim_tod(origin->set_timezone(zone),whut,@args); + Calendar.Rule.Timezone zone = Calendar.Timezone[zonename]; + + if( !zone ) + { + if (zonename[0]=='"') sscanf(zonename,"\"%s\"",zonename); + sscanf(zonename,"%*[ \t]%s",zonename); + + if(sizeof(zonename)==4 && zonename[2]=='S') + zonename = zonename[0..1] + zonename[3..3]; + else if(sizeof(zonename)>4 && has_suffix(zonename, "DST")) + zonename = zonename[..<3]; + + if (origin->rules->abbr2zone[zonename]) + zonename=origin->rules->abbr2zone[zonename]; + + zone=Calendar.Timezone[zonename]; + + if (!zone) + { + if (sscanf(zonename,"%[^+-]%s",string a,string b)==2 && a!="" && b!="") + { + TimeRange tr=dwim_zone(origin,a,whut,@args); + if (!tr) return 0; + + return + dwim_tod(origin->set_timezone( + Calendar.Timezone.make_new_timezone( + tr->timezone(), + Calendar.Timezone.decode_timeskew(b))), + whut,@args); + } + if(!abbr2zones) + abbr2zones = master()->resolv("Calendar")["TZnames"]["abbr2zones"]; + array pz=abbr2zones[zonename]; + if (!pz) return 0; + foreach (pz,string zn) + { + TimeRange try=dwim_zone(origin,zn,whut,@args); + if (try && try->tzname()==zonename) return try; + } + return 0; + } + } + return dwim_tod(origin->set_timezone(zone),whut,@args); } protected mapping(string:array) parse_format_cache=([]); @@ -3053,7 +3058,6 @@ TimeRange parse(string fmt,string arg,void|TimeRange context) return 0; // need "am" or "pm" } } - if (m->z) // zone low = dwim_zone(low,m->z,g,h,mi,s); else if (g) @@ -3274,19 +3278,19 @@ TimeofDay http_time(string what, void|TimeRange cx) { TimeofDay t; - string date1 = "%D %M %Y"; // 2+1+3+1+4=11 - string date2 = "%D-%M-%y"; // 2+1+3+1+2=9 - string date3 = "%M %*[ ]%D"; // 2+1+2=5 - string time = "%h:%m:%s"; // 2+1+2+1+2=8 + constant date1 = "%D %M %Y"; // 2+1+3+1+4=11 + constant date2 = "%D-%M-%y"; // 2+1+3+1+2=9 + constant date3 = "%M %*[ ]%D"; // 2+1+2=5 + constant time = "%h:%m:%s"; // 2+1+2+1+2=8 // 3+2+ 11 +1+ 8 +4 = 29 - string rfc1123_date = "%e, "+date1+" "+time+" %z"; + constant rfc1123_date = "%e, "+date1+" "+time+" %z"; // 6+2+ 9 +1+ 8 +4 = 33 - string rfc850_date = "%e, "+date2+" "+time+" %z"; + constant rfc850_date = "%e, "+date2+" "+time+" %z"; // 3+1+ 5 +1+ 8 +1+4 = 23 - string asctime_date = "%e "+date3+" "+time+" %Y"; + constant asctime_date = "%e "+date3+" "+time+" %Y"; if( sizeof(what)<23 ) return 0;