source: Dev/trunk/src/client/dojo/date/stamp.js @ 529

Last change on this file since 529 was 483, checked in by hendrikvanantwerpen, 11 years ago

Added Dojo 1.9.3 release.

File size: 4.9 KB
Line 
1define(["../_base/lang", "../_base/array"], function(lang, array){
2
3// module:
4//              dojo/date/stamp
5
6var stamp = {
7        // summary:
8        //              TODOC
9};
10lang.setObject("dojo.date.stamp", stamp);
11
12// Methods to convert dates to or from a wire (string) format using well-known conventions
13
14stamp.fromISOString = function(/*String*/ formattedString, /*Number?*/ defaultTime){
15        // summary:
16        //              Returns a Date object given a string formatted according to a subset of the ISO-8601 standard.
17        //
18        // description:
19        //              Accepts a string formatted according to a profile of ISO8601 as defined by
20        //              [RFC3339](http://www.ietf.org/rfc/rfc3339.txt), except that partial input is allowed.
21        //              Can also process dates as specified [by the W3C](http://www.w3.org/TR/NOTE-datetime)
22        //              The following combinations are valid:
23        //
24        //              - dates only
25        //                      - yyyy
26        //                      - yyyy-MM
27        //                      - yyyy-MM-dd
28        //              - times only, with an optional time zone appended
29        //                      - THH:mm
30        //                      - THH:mm:ss
31        //                      - THH:mm:ss.SSS
32        //              - and "datetimes" which could be any combination of the above
33        //
34        //              timezones may be specified as Z (for UTC) or +/- followed by a time expression HH:mm
35        //              Assumes the local time zone if not specified.  Does not validate.  Improperly formatted
36        //              input may return null.  Arguments which are out of bounds will be handled
37        //              by the Date constructor (e.g. January 32nd typically gets resolved to February 1st)
38        //              Only years between 100 and 9999 are supported.
39        // formattedString:
40        //              A string such as 2005-06-30T08:05:00-07:00 or 2005-06-30 or T08:05:00
41        // defaultTime:
42        //              Used for defaults for fields omitted in the formattedString.
43        //              Uses 1970-01-01T00:00:00.0Z by default.
44
45        if(!stamp._isoRegExp){
46                stamp._isoRegExp =
47//TODO: could be more restrictive and check for 00-59, etc.
48                        /^(?:(\d{4})(?:-(\d{2})(?:-(\d{2}))?)?)?(?:T(\d{2}):(\d{2})(?::(\d{2})(.\d+)?)?((?:[+-](\d{2}):(\d{2}))|Z)?)?$/;
49        }
50
51        var match = stamp._isoRegExp.exec(formattedString),
52                result = null;
53
54        if(match){
55                match.shift();
56                if(match[1]){match[1]--;} // Javascript Date months are 0-based
57                if(match[6]){match[6] *= 1000;} // Javascript Date expects fractional seconds as milliseconds
58
59                if(defaultTime){
60                        // mix in defaultTime.  Relatively expensive, so use || operators for the fast path of defaultTime === 0
61                        defaultTime = new Date(defaultTime);
62                        array.forEach(array.map(["FullYear", "Month", "Date", "Hours", "Minutes", "Seconds", "Milliseconds"], function(prop){
63                                return defaultTime["get" + prop]();
64                        }), function(value, index){
65                                match[index] = match[index] || value;
66                        });
67                }
68                result = new Date(match[0]||1970, match[1]||0, match[2]||1, match[3]||0, match[4]||0, match[5]||0, match[6]||0); //TODO: UTC defaults
69                if(match[0] < 100){
70                        result.setFullYear(match[0] || 1970);
71                }
72
73                var offset = 0,
74                        zoneSign = match[7] && match[7].charAt(0);
75                if(zoneSign != 'Z'){
76                        offset = ((match[8] || 0) * 60) + (Number(match[9]) || 0);
77                        if(zoneSign != '-'){ offset *= -1; }
78                }
79                if(zoneSign){
80                        offset -= result.getTimezoneOffset();
81                }
82                if(offset){
83                        result.setTime(result.getTime() + offset * 60000);
84                }
85        }
86
87        return result; // Date or null
88};
89
90/*=====
91var __Options = {
92        // selector: String
93        //              "date" or "time" for partial formatting of the Date object.
94        //              Both date and time will be formatted by default.
95        // zulu: Boolean
96        //              if true, UTC/GMT is used for a timezone
97        // milliseconds: Boolean
98        //              if true, output milliseconds
99};
100=====*/
101
102stamp.toISOString = function(/*Date*/ dateObject, /*__Options?*/ options){
103        // summary:
104        //              Format a Date object as a string according a subset of the ISO-8601 standard
105        //
106        // description:
107        //              When options.selector is omitted, output follows [RFC3339](http://www.ietf.org/rfc/rfc3339.txt)
108        //              The local time zone is included as an offset from GMT, except when selector=='time' (time without a date)
109        //              Does not check bounds.  Only years between 100 and 9999 are supported.
110        //
111        // dateObject:
112        //              A Date object
113
114        var _ = function(n){ return (n < 10) ? "0" + n : n; };
115        options = options || {};
116        var formattedDate = [],
117                getter = options.zulu ? "getUTC" : "get",
118                date = "";
119        if(options.selector != "time"){
120                var year = dateObject[getter+"FullYear"]();
121                date = ["0000".substr((year+"").length)+year, _(dateObject[getter+"Month"]()+1), _(dateObject[getter+"Date"]())].join('-');
122        }
123        formattedDate.push(date);
124        if(options.selector != "date"){
125                var time = [_(dateObject[getter+"Hours"]()), _(dateObject[getter+"Minutes"]()), _(dateObject[getter+"Seconds"]())].join(':');
126                var millis = dateObject[getter+"Milliseconds"]();
127                if(options.milliseconds){
128                        time += "."+ (millis < 100 ? "0" : "") + _(millis);
129                }
130                if(options.zulu){
131                        time += "Z";
132                }else if(options.selector != "time"){
133                        var timezoneOffset = dateObject.getTimezoneOffset();
134                        var absOffset = Math.abs(timezoneOffset);
135                        time += (timezoneOffset > 0 ? "-" : "+") +
136                                _(Math.floor(absOffset/60)) + ":" + _(absOffset%60);
137                }
138                formattedDate.push(time);
139        }
140        return formattedDate.join('T'); // String
141};
142
143return stamp;
144});
Note: See TracBrowser for help on using the repository browser.