REBOL[ Title: "to-fussy-idate" Version: 1.0.1 Date: 17-01-2005 Author: "Peter WA Wood" Copyright: "Peter WA Wood" File: %to-fussy-idate.r Purpose: {A function which converts a Rebol date! to a string formatted according to a strict interpretation of the RFC 822 standard. If the time is not provided, a default of 00:00 is used. If the seconds are not set, 00 is used. (NB The zone defaults to 00:00 in a Rebol date) Based on the original to-idate of Rebol/core and comments on the Rebol mailing list.} Usage: { example: to-fussy-idate rebol-date } Library: [ level: 'beginner type: 'function domain: [web ] platform: 'all tested-under: [ core 2.5.6.2.4 "Mac OS X 10.2.8" core 2.5.6.3.1 "Windows XP Professional" view 1.2.10.3.1 "Windows XP Professional" ] support: none license: cc-by {see http://www.rebol.org/cgi-bin/cgiwrap/rebol/license-help.r} ] ] to-fussy-idate: func [ {converts a date! to a string formatted according to a strict interpretation of the RFC 822 standard. If the time is not set on the input date, a default of 00:00 is used. If the seconds of the time is not set, 00 is used. Warning: if the year supplied is four digits, Rebol correctly allocates the weekday taking into account the century. This may cause validation problems if the date is before the late 20th century or after the early 21st century. } the-date [date!] "The date to be reformatted" /local fussy "The string to be returned" ][ ;; Build the output string from back forwards fussy: copy " UT" ; Always use UT (GMT) for time ; zone offset either the-date/time [ ; the date has a time insert fussy the-date/zone/minute if the-date/zone/minute < 10 [insert fussy "0"] insert fussy absolute the-date/zone/hour if 10 > absolute the-date/zone/hour [insert fussy "0"] either the-date/zone/hour < 0 [insert fussy " -"] [insert fussy " +"] if the-date/time/second = 0 ; Rebol only returns hh:mm if [insert fussy ":00"] ; seconds is zero insert fussy rejoin [the-date/time] either the-date/time/hour < 10 ; Rebol doesn't return leading [insert fussy " 0"] ; zero on hour [insert fussy " "] ][ fussy: " 00:00:00 +0000 UT" ; the date has no time ] insert fussy remainder the-date/year 100 ; last 2 digits of the year either 10 > remainder the-date/year 100 [insert fussy " 0"] [insert fussy " "] insert fussy rejoin [ " " pick [ "Jan" "Feb" "Mar" "Apr" "May" "Jun" "Jul" "Aug" "Sep" "Oct" "Nov" "Dec"] the-date/month ] insert fussy the-date/day either the-date/day < 10 [insert fussy ", 0"] [insert fussy ", " ] insert fussy pick ["Mon" "Tue" "Wed" "Thu" "Fri" "Sat" "Sun"] the-date/weekday return head fussy ] ; end to-fussy-idate ;; History ;; ;; 1.0.0 17-Jan-2005 Initial release (no optimisation) ;; 1.0.1 18-Apr-2005 Tested under View 1.2.10.3.1 Windows XP ;;