[Gd-chatter] r11238 - trunk/fundev/sources/system
turbo24prg at gwydiondylan.org
turbo24prg at gwydiondylan.org
Sat Mar 17 12:53:09 CET 2007
Author: turbo24prg
Date: Sat Mar 17 12:53:07 2007
New Revision: 11238
Modified:
trunk/fundev/sources/system/date.dylan
trunk/fundev/sources/system/library.dylan
Log:
Job: minor
implemented parse-date, counterpart to format-date
Modified: trunk/fundev/sources/system/date.dylan
==============================================================================
--- trunk/fundev/sources/system/date.dylan (original)
+++ trunk/fundev/sources/system/date.dylan Sat Mar 17 12:53:07 2007
@@ -358,17 +358,17 @@
day-of-week, time-zone-offset) = decode-date(date);
let absolute-time-zone-offset :: <integer> = abs(time-zone-offset);
local method wrap (wrap :: <string>, i :: <integer>) => (string :: <string>)
- if (i < 10) concatenate(wrap, integer-to-string(i));
- else integer-to-string(i) end;
- end;
+ if (i < 10) concatenate(wrap, integer-to-string(i));
+ else integer-to-string(i) end;
+ end;
local method format-integer (integer :: <integer>, length :: <integer>) => (string :: <string>)
- let string = make(<byte-string>, size: length, fill: '0');
- for (position from 0 below length)
- string[length - position - 1] := $digits[modulo(integer, 10)];
- integer := floor/(integer, 10);
+ let string = make(<byte-string>, size: length, fill: '0');
+ for (position from 0 below length)
+ string[length - position - 1] := $digits[modulo(integer, 10)];
+ integer := floor/(integer, 10);
+ end;
+ string
end;
- string
- end;
let date-string :: <string> = "";
let format? :: <boolean> = #f;
let use-dots? :: <boolean> = #f;
@@ -382,7 +382,7 @@
'Y' => integer-to-string(year);
'y' => format-integer(year, 2);
'H' => wrap("0", hours);
- 'k' => integer-to-string(hours);
+ 'k' => wrap(" ", hours);
'M' => wrap("0", minutes);
'S' => wrap("0", seconds);
'm' => wrap("0", month);
@@ -434,8 +434,73 @@
format-date("%Y-%m-%dT%H:%M:%S%:z", date);
end;
+define variable *default-date-formats* :: <sequence> = #();
+
+define method parse-date (date :: <string>, format :: <string>)
+ => (date :: false-or(<date>));
+
+ let date-stream = make(<string-stream>, contents: date);
+ let date = make(<date>, year: 1970, month: 1, day: 1);
+ let format? :: <boolean> = #f;
+ let use-dots? :: <boolean> = #f;
+
+ local method parse-month (month-names :: <sequence>)
+ let start = stream-position(date-stream);
+ date.date-month := block (return)
+ for (month-name in month-names)
+ if (month-name = read(date-stream, size(month-name)))
+ return(find-key(month-names, curry(\=, month-name)) + 1);
+ else
+ date-stream.stream-position := start;
+ end if;
+ end for;
+ end block;
+ end;
+
+ for (char in format)
+ if (char = '%' & ~ format?)
+ format? := #t;
+ elseif (char = ':' & format?)
+ use-dots? := #t;
+ elseif (format?)
+ select (char)
+ 'Y' => date.date-year := string-to-integer(read(date-stream, 4));
+ 'y' => date.date-year := begin
+ let year = string-to-integer(read(date-stream, 2));
+ if (year < 70) 1900 else 2000 end if + year;
+ end;
+ 'H', 'k' => date.date-hours := string-to-integer(read(date-stream, 2));
+ 'M' => date.date-minutes := string-to-integer(read(date-stream, 2));
+ 'S' => date.date-seconds := string-to-integer(read(date-stream, 2));
+ 'm' => date.date-month := string-to-integer(read(date-stream, 2));
+ 'd', 'e' => date.date-day := string-to-integer(read(date-stream, 2));
+ 'B' => parse-month(*month-names*);
+ 'b' => parse-month(*short-month-names*);
+ 'z' => date.date-time-zone-offset := begin
+ let sign = read(date-stream, 1);
+ let hours = read(date-stream, 2);
+ if (use-dots?)
+ read(date-stream, 1);
+ end if;
+ let minutes = read(date-stream, 2);
+ string-to-integer(concatenate(sign, "1")) *
+ string-to-integer(hours) * 60 + string-to-integer(minutes);
+ end;
+ 'n', '%' => read(date-stream, 1);
+ otherwise => #f;
+ end select;
+ format? := #f;
+ use-dots? := #f;
+ else
+ read(date-stream, 1);
+ end if;
+ end for;
+ date;
+end;
+
///---*** Doesn't yet parse all legitimate forms of ISO 8601 strings.
///---*** For now, just parse a small superset of the strings produced above ...
+// parse-date(foo, "%Y-%m-%dT%H:%M:%S%:z") , "%Y-%m-%dT%H:%M:%S%z", ...
define function parse-iso8601-string (string :: <string>)
=> (year :: <integer>, month :: <integer>, day :: <integer>,
hours :: <integer>, minutes :: <integer>, seconds :: <integer>,
Modified: trunk/fundev/sources/system/library.dylan
==============================================================================
--- trunk/fundev/sources/system/library.dylan (original)
+++ trunk/fundev/sources/system/library.dylan Sat Mar 17 12:53:07 2007
@@ -86,6 +86,7 @@
<day-of-week>,
date-day-of-week,
format-date,
+ parse-date,
as-iso8601-string,
as-rfc822-string,
as-rfc1123-string,
More information about the chatter
mailing list