sugar
Version:
A Javascript library for working with native objects.
702 lines (520 loc) • 181 kB
JavaScript
test('Date', function () {
equal(Date.getLocale().code !== undefined, true, 'Current locale must be something... other libs may overwrite this');
// Imaginary local to test locale switching
Date.addLocale('fo', {
units: 'do,re,mi,fa,so,la,ti,do',
months: 'do,re,mi,fa,so,la,ti,do',
dateParse: '{year}kupo',
duration: '{num}{unit}momoney',
long: 'yeehaw'
});
Date.setLocale('en');
// Mootools over-stepping itself here with the "create" method implemented as a Function instance method,
// which interferes with class methods as classes themselves are functions. Taking back this class method
// for the sake of the tests.
if(typeof Date.create() === 'function') {
Date.restore('create');
};
var day, d, date1, date2, dst, o;
var staticWinterTimezoneOffset = new Date(2011, 0, 1).getTimezoneOffset();
var staticSummerTimezoneOffset = new Date(2011, 8, 1).getTimezoneOffset();
var now = new Date();
var thisYear = now.getFullYear();
// Invalid date
equal(new Date('a fridge too far').isValid(), false, 'Date#isValid | new Date invalid');
equal(new Date().isValid(), true, 'Date#isValid | new Date valid');
equal(Date.create().isValid(), true, 'Date#isValid | created date is valid');
equal(Date.create('a fridge too far').isValid(), false, 'Date#isValid | Date#create invalid');
d = new Date(1998, 0);
equal(d.isUTC(), d.getTimezoneOffset() === 0, 'Date#isUTC | UTC is true if the current timezone has no offset');
// UTC is still false even if the time is reset to the intended utc equivalent, as timezones can never be changed
equal(d.clone().addMinutes(d.getTimezoneOffset()).isUTC(), d.getTimezoneOffset() === 0, 'Date#isUTC | UTC cannot be forced');
dateEqual(Date.create(), new Date(), 'Date#create | empty');
// Date constructor accepts enumerated parameters
dateEqual(Date.create(1998), new Date(1998), 'Date#create | enumerated | 1998');
dateEqual(Date.create(1998,1), new Date(1998,1), 'Date#create | enumerated | January, 1998');
dateEqual(Date.create(1998,1,23), new Date(1998,1,23), 'Date#create | enumerated | January 23, 1998');
dateEqual(Date.create(1998,1,23,11), new Date(1998,1,23,11), 'Date#create | enumerated | January 23, 1998 11am');
dateEqual(Date.create(1998,1,23,11,54), new Date(1998,1,23,11,54), 'Date#create | enumerated | January 23, 1998 11:54am');
dateEqual(Date.create(1998,1,23,11,54,32), new Date(1998,1,23,11,54,32), 'Date#create | enumerated | January 23, 1998 11:54:32');
dateEqual(Date.create(1998,1,23,11,54,32,454), new Date(1998,1,23,11,54,32,454), 'Date#create | enumerated | January 23, 1998 11:54:32.454');
dateEqual(Date.create('1998', true), new Date(1998, 0), 'Date#create | will not choke on a boolean as second param');
dateEqual(Date.create('1998', ''), new Date(1998, 0), 'Date#create | will not choke on an empty string as second param');
// Date constructor accepts an object
dateEqual(Date.create({ year: 1998 }), new Date(1998, 0), 'Date#create | object | 1998');
dateEqual(Date.create({ year: 1998, month: 1 }), new Date(1998,1), 'Date#create | object | January, 1998');
dateEqual(Date.create({ year: 1998, month: 1, day: 23 }), new Date(1998,1,23), 'Date#create | object | January 23, 1998');
dateEqual(Date.create({ year: 1998, month: 1, day: 23, hour: 11 }), new Date(1998,1,23,11), 'Date#create | object | January 23, 1998 11am');
dateEqual(Date.create({ year: 1998, month: 1, day: 23, hour: 11, minutes: 54 }), new Date(1998,1,23,11,54), 'Date#create | object | January 23, 1998 11:54am');
dateEqual(Date.create({ year: 1998, month: 1, day: 23, hour: 11, minutes: 54, seconds: 32 }), new Date(1998,1,23,11,54,32), 'Date#create | object | January 23, 1998 11:54:32');
dateEqual(Date.create({ year: 1998, month: 1, day: 23, hour: 11, minutes: 54, seconds: 32, milliseconds: 454 }), new Date(1998,1,23,11,54,32,454), 'Date#create | object | January 23, 1998 11:54:32.454');
dateEqual(new Date(new Date(2008, 6, 22)), new Date(2008, 6, 22), 'Date | date accepts itself as a constructor');
var timestamp = 1294012800000;
d = Date.create(timestamp); // 2011-01-03 00:00:00
equal(d.getFullYear(), 2011, 'Date#create | Accepts numbers | 2011')
equal(d.getMonth(), 0, 'Date#create | Accepts numbers | January');
equal(d.getDate(), Math.floor(3 - (d.getTimezoneOffset() / 60 / 24)), 'Date#create | Accepts numbers | January');
equal(d.is(timestamp), true, 'Date#is | Accepts numbers');
dateEqual(Date.create('1999'), new Date(1999, 0), 'Date#create | Just the year');
dateEqual(Date.create('June'), new Date(thisYear, 5), 'Date#create | Just the month');
dateEqual(Date.create('June 15'), new Date(thisYear, 5, 15), 'Date#create | Month and day');
dateEqual(Date.create('June 15th'), new Date(thisYear, 5, 15), 'Date#create | Month and ordinal day');
// Slashes (American style)
dateEqual(Date.create('08/25'), new Date(thisYear, 7, 25), 'Date#create | American style slashes | mm/dd');
dateEqual(Date.create('8/25'), new Date(thisYear, 7, 25), 'Date#create | American style slashes | m/dd');
dateEqual(Date.create('08/25/1978'), new Date(1978, 7, 25), 'Date#create | American style slashes | mm/dd/yyyy');
dateEqual(Date.create('8/25/1978'), new Date(1978, 7, 25), 'Date#create | American style slashes | /m/dd/yyyy');
dateEqual(Date.create('8/25/78'), new Date(1978, 7, 25), 'Date#create | American style slashes | m/dd/yy');
dateEqual(Date.create('08/25/78'), new Date(1978, 7, 25), 'Date#create | American style slashes | mm/dd/yy');
dateEqual(Date.create('8/25/01'), new Date(2001, 7, 25), 'Date#create | American style slashes | m/dd/01');
dateEqual(Date.create('8/25/49'), new Date(2049, 7, 25), 'Date#create | American style slashes | m/dd/49');
dateEqual(Date.create('8/25/50'), new Date(1950, 7, 25), 'Date#create | American style slashes | m/dd/50');
// August 25, 0001... the numeral 1 gets interpreted as 1901...
// freakin' unbelievable...
dateEqual(toUTC(Date.create('08/25/0001')), new Date(-62115206400000), 'Date#create | American style slashes | mm/dd/0001');
// Dashes (American style)
dateEqual(Date.create('08-25-1978'), new Date(1978, 7, 25), 'Date#create | American style dashes | mm-dd-yyyy');
dateEqual(Date.create('8-25-1978'), new Date(1978, 7, 25), 'Date#create | American style dashes | m-dd-yyyy');
// dd-dd-dd is NOT a valid ISO 8601 representation as of 2004, hence this format will
// revert to a little endian representation, where year truncation is allowed. See:
// http://en.wikipedia.org/wiki/ISO_8601#Truncated_representations
dateEqual(Date.create('08-05-05'), new Date(2005, 7, 5), 'Date#create | dd-dd-dd is an ISO8601 format');
// Dots (American style)
dateEqual(Date.create('08.25.1978'), new Date(1978, 7, 25), 'Date#create | American style dots | mm.dd.yyyy');
dateEqual(Date.create('8.25.1978'), new Date(1978, 7, 25), 'Date#create | American style dots | m.dd.yyyy');
// Abbreviated reverse slash format yy/mm/dd cannot exist because it clashes with forward
// slash format dd/mm/yy (with european variant). This rule however, doesn't follow for dashes,
// which is abbreviated ISO8601 format: yy-mm-dd
dateEqual(Date.create('01/02/03'), new Date(2003, 0, 2), 'Date#create | Ambiguous 2 digit format mm/dd/yy');
dateEqual(Date.create('08/10', 'en-GB'), new Date(thisYear, 9, 8), 'Date#create | European style slashes | dd/mm');
dateEqual(Date.create('8/10', 'en-GB'), new Date(thisYear, 9, 8), 'Date#create | European style slashes | d/mm');
dateEqual(Date.create('08/10/1978', 'en-GB'), new Date(1978, 9, 8), 'Date#create | European style slashes | dd/mm/yyyy');
dateEqual(Date.create('8/10/1978', 'en-GB'), new Date(1978, 9, 8), 'Date#create | European style slashes | d/mm/yyyy');
dateEqual(Date.create('8/10/78', 'en-GB'), new Date(1978, 9, 8), 'Date#create | European style slashes | d/mm/yy');
dateEqual(Date.create('08/10/78', 'en-GB'), new Date(1978, 9, 8), 'Date#create | European style slashes | dd/mm/yy');
dateEqual(Date.create('8/10/01', 'en-GB'), new Date(2001, 9, 8), 'Date#create | European style slashes | d/mm/01');
dateEqual(Date.create('8/10/49', 'en-GB'), new Date(2049, 9, 8), 'Date#create | European style slashes | d/mm/49');
dateEqual(Date.create('8/10/50', 'en-GB'), new Date(1950, 9, 8), 'Date#create | European style slashes | d/mm/50');
dateEqual(Date.create('08/10', 'en-AU'), new Date(thisYear, 9, 8), 'Date#create | European style slashes | any English locale suffix should work and not use US format');
// Dashes (European style)
dateEqual(Date.create('08-10-1978', 'en-GB'), new Date(1978, 9, 8), 'Date#create | European style dashes | mm-dd-yyyy');
// Dots (European style)
dateEqual(Date.create('08.10.1978', 'en-GB'), new Date(1978, 9, 8), 'Date#create | European style dots | dd.mm.yyyy');
dateEqual(Date.create('8.10.1978', 'en-GB'), new Date(1978, 9, 8), 'Date#create | European style dots | d.mm.yyyy');
dateEqual(Date.create('08-05-05', 'en-GB'), new Date(2005, 4, 8), 'Date#create | dd-dd-dd is NOT an ISO8601 format');
dateEqual(Date.create('8/10/85'), new Date(1985, 7, 10), 'Date#create | American format will now revert back');
Date.setLocale('en-GB');
dateEqual(Date.create('8/10/85'), new Date(1985, 9, 8), 'Date#create | European style slashes | after global set');
Date.setLocale('en');
dateEqual(Date.create('8/10/85'), new Date(1985, 7, 10), 'Date#create | European style slashes | before global reset');
// Stolen with love from XDate, ability to parse IETF format
dateEqual(Date.create('Mon Sep 05 2011 12:30:00 GMT-0700 (PDT)'), getUTCDate(2011,9,5,19,30), 'Date#create | IETF format');
/*
* Reverse slashes
* This seems like it should be invalid. Looking at the link below it seems that there isn't a format
* that uses slashes in combination with the "big endian" format. If this changes or there is a valid
* use case here then we can rethink...
*
* http://en.wikipedia.org/wiki/Calendar_date
*
*/
//dateEqual(Date.create('1978/08/25'), new Date(1978, 7, 25), 'Date#create | Reverse slashes | yyyy/mm/dd');
//dateEqual(Date.create('1978/8/25'), new Date(1978, 7, 25), 'Date#create | Reverse slashes | yyyy/m/dd');
//dateEqual(Date.create('1978/08'), new Date(1978, 7), 'Date#create | Reverse slashes | yyyy/mm');
//dateEqual(Date.create('1978/8'), new Date(1978, 7), 'Date#create | Reverse slashes | yyyy/m');
// Reverse dashes
dateEqual(Date.create('1978-08-25'), new Date(1978, 7, 25), 'Date#create | Reverse dashes | yyyy-mm-dd');
dateEqual(Date.create('1978-08'), new Date(1978, 7), 'Date#create | Reverse dashes | yyyy-mm');
dateEqual(Date.create('1978-8'), new Date(1978, 7), 'Date#create | Reverse dashes | yyyy-m');
// Reverse dots
dateEqual(Date.create('1978.08.25'), new Date(1978, 7, 25), 'Date#create | Reverse dots | yyyy.mm.dd');
dateEqual(Date.create('1978.08'), new Date(1978, 7), 'Date#create | Reverse dots | yyyy.mm');
dateEqual(Date.create('1978.8'), new Date(1978, 7), 'Date#create | Reverse dots | yyyy.m');
dateEqual(Date.create('01-02-03', 'en-GB'), new Date(2003, 1, 1), 'Date#create | Ambiguous 2 digit variant yy-mm-dd is NOT ISO 8601');
dateEqual(Date.create('01/02/03', 'en-GB'), new Date(2003, 1, 1), 'Date#create | Ambiguous 2 digit European variant dd/mm/yy');
// Text based formats
dateEqual(Date.create('June 2008'), new Date(2008, 5), 'Date#create | Full text | Month yyyy');
dateEqual(Date.create('June-2008'), new Date(2008, 5), 'Date#create | Full text | Month-yyyy');
dateEqual(Date.create('June.2008'), new Date(2008, 5), 'Date#create | Full text | Month.yyyy');
dateEqual(Date.create('06-2008'), new Date(2008, 5), 'Date#create | Full text | mm-yyyy');
dateEqual(Date.create('6-2008'), new Date(2008, 5), 'Date#create | Full text | m-yyyy');
dateEqual(Date.create('June 1st, 2008'), new Date(2008, 5, 1), 'Date#create | Full text | Month 1st, yyyy');
dateEqual(Date.create('June 2nd, 2008'), new Date(2008, 5, 2), 'Date#create | Full text | Month 2nd, yyyy');
dateEqual(Date.create('June 3rd, 2008'), new Date(2008, 5, 3), 'Date#create | Full text | Month 3rd, yyyy');
dateEqual(Date.create('June 4th, 2008'), new Date(2008, 5, 4), 'Date#create | Full text | Month 4th, yyyy');
dateEqual(Date.create('June 15th, 2008'), new Date(2008, 5, 15), 'Date#create | Full text | Month 15th, yyyy');
dateEqual(Date.create('June 1st 2008'), new Date(2008, 5, 1), 'Date#create | Full text | Month 1st yyyy');
dateEqual(Date.create('June 2nd 2008'), new Date(2008, 5, 2), 'Date#create | Full text | Month 2nd yyyy');
dateEqual(Date.create('June 3rd 2008'), new Date(2008, 5, 3), 'Date#create | Full text | Month 3rd yyyy');
dateEqual(Date.create('June 4th 2008'), new Date(2008, 5, 4), 'Date#create | Full text | Month 4th yyyy');
dateEqual(Date.create('June 15, 2008'), new Date(2008, 5, 15), 'Date#create | Full text | Month dd, yyyy');
dateEqual(Date.create('June 15 2008'), new Date(2008, 5, 15), 'Date#create | Full text | Month dd yyyy');
dateEqual(Date.create('15 July, 2008'), new Date(2008, 6, 15), 'Date#create | Full text | dd Month, yyyy');
dateEqual(Date.create('15 July 2008'), new Date(2008, 6, 15), 'Date#create | Full text | dd Month yyyy');
dateEqual(Date.create('juNe 1St 2008'), new Date(2008, 5, 1), 'Date#create | Full text | Month 1st yyyy case insensitive');
// Special cases
dateEqual(Date.create(' July 4th, 1987 '), new Date(1987, 6, 4), 'Date#create | Special Cases | Untrimmed full text');
dateEqual(Date.create(' 7/4/1987 '), new Date(1987, 6, 4), 'Date#create | Special Cases | Untrimmed American');
dateEqual(Date.create(' 1987-07-04 '), new Date(1987, 6, 4), 'Date#create | Special Cases | Untrimmed ISO8601');
// Abbreviated formats
dateEqual(Date.create('Dec 1st, 2008'), new Date(2008, 11, 1), 'Date#create | Abbreviated | without dot');
dateEqual(Date.create('Dec. 1st, 2008'), new Date(2008, 11, 1), 'Date#create | Abbreviated | with dot');
dateEqual(Date.create('1 Dec. 2008'), new Date(2008, 11, 1), 'Date#create | Abbreviated | reversed with dot');
dateEqual(Date.create('1 Dec., 2008'), new Date(2008, 11, 1), 'Date#create | Abbreviated | reversed with dot and comma');
dateEqual(Date.create('1 Dec, 2008'), new Date(2008, 11, 1), 'Date#create | Abbreviated | reversed with comma and no dot');
// http://en.wikipedia.org/wiki/Calendar_date
dateEqual(Date.create('09-May-78'), new Date(1978, 4, 9), 'Date#create | Abbreviated | little endian yy');
dateEqual(Date.create('09-May-1978'), new Date(1978, 4, 9), 'Date#create | Abbreviated | little endian yyyy');
dateEqual(Date.create('1978-May-09'), new Date(1978, 4, 9), 'Date#create | Abbreviated | big endian');
dateEqual(Date.create('Wednesday July 3rd, 2008'), new Date(2008, 6, 3), 'Date#create | Full Text | With day of week');
dateEqual(Date.create('Wed July 3rd, 2008'), new Date(2008, 6, 3), 'Date#create | Full Text | With day of week abbreviated');
dateEqual(Date.create('Wed. July 3rd, 2008'), new Date(2008, 6, 3), 'Date#create | Full Text | With day of week abbreviated plus dot');
dateEqual(Date.create('Wed, 03 Jul 2008 08:00:00 EST'), new Date(Date.UTC(2008, 6, 3, 13)), 'Date#create | RFC822');
// ISO 8601
dateEqual(Date.create('2001-1-1'), new Date(2001, 0, 1), 'Date#create | ISO8601 | not padded');
dateEqual(Date.create('2001-01-1'), new Date(2001, 0, 1), 'Date#create | ISO8601 | month padded');
dateEqual(Date.create('2001-01-01'), new Date(2001, 0, 1), 'Date#create | ISO8601 | month and day padded');
dateEqual(Date.create('2010-11-22'), new Date(2010, 10,22), 'Date#create | ISO8601 | month and day padded 2010');
dateEqual(Date.create('20101122'), new Date(2010, 10,22), 'Date#create | ISO8601 | digits strung together');
dateEqual(Date.create('17760523T024508+0830'), getUTCDate(1776, 5, 22, 18, 15, 08), 'Date#create | ISO8601 | full datetime strung together');
dateEqual(Date.create('-0002-07-26'), new Date(-2, 6, 26), 'Date#create | ISO8601 | minus sign (bc)'); // BC
dateEqual(Date.create('+1978-04-17'), new Date(1978, 3, 17), 'Date#create | ISO8601 | plus sign (ad)'); // AD
// Date with time formats
dateEqual(Date.create('08/25/1978 12:04'), new Date(1978, 7, 25, 12, 4), 'Date#create | Date/Time | Slash format');
dateEqual(Date.create('08-25-1978 12:04'), new Date(1978, 7, 25, 12, 4), 'Date#create | Date/Time | Dash format');
dateEqual(Date.create('1978/08/25 12:04'), new Date(1978, 7, 25, 12, 4), 'Date#create | Date/Time | Reverse slash format');
dateEqual(Date.create('June 1st, 2008 12:04'), new Date(2008, 5, 1, 12, 4), 'Date#create | Date/Time | Full text format');
dateEqual(Date.create('08-25-1978 12:04:57'), new Date(1978, 7, 25, 12, 4, 57), 'Date#create | Date/Time | with seconds');
dateEqual(Date.create('08-25-1978 12:04:57.322'), new Date(1978, 7, 25, 12, 4, 57, 322), 'Date#create | Date/Time | with milliseconds');
dateEqual(Date.create('08-25-1978 12pm'), new Date(1978, 7, 25, 12), 'Date#create | Date/Time | with am/pm');
dateEqual(Date.create('08-25-1978 12:42pm'), new Date(1978, 7, 25, 12, 42), 'Date#create | Date/Time | with minutes and am/pm');
dateEqual(Date.create('08-25-1978 12:42:32pm'), new Date(1978, 7, 25, 12, 42, 32), 'Date#create | Date/Time | with seconds and am/pm');
dateEqual(Date.create('08-25-1978 12:42:32.488pm'), new Date(1978, 7, 25, 12, 42, 32, 488), 'Date#create | Date/Time | with seconds and am/pm');
dateEqual(Date.create('08-25-1978 00:00am'), new Date(1978, 7, 25, 0, 0, 0, 0), 'Date#create | Date/Time | with zero am');
dateEqual(Date.create('08-25-1978 00:00:00am'), new Date(1978, 7, 25, 0, 0, 0, 0), 'Date#create | Date/Time | with seconds and zero am');
dateEqual(Date.create('08-25-1978 00:00:00.000am'), new Date(1978, 7, 25, 0, 0, 0, 0), 'Date#create | Date/Time | with milliseconds and zero am');
dateEqual(Date.create('08-25-1978 1pm'), new Date(1978, 7, 25, 13), 'Date#create | Date/Time | 1pm am/pm');
dateEqual(Date.create('08-25-1978 1:42pm'), new Date(1978, 7, 25, 13, 42), 'Date#create | Date/Time | 1pm minutes and am/pm');
dateEqual(Date.create('08-25-1978 1:42:32pm'), new Date(1978, 7, 25, 13, 42, 32), 'Date#create | Date/Time | 1pm seconds and am/pm');
dateEqual(Date.create('08-25-1978 1:42:32.488pm'), new Date(1978, 7, 25, 13, 42, 32, 488), 'Date#create | Date/Time | 1pm seconds and am/pm');
dateEqual(Date.create('08-25-1978 1am'), new Date(1978, 7, 25, 1), 'Date#create | Date/Time | 1am am/pm');
dateEqual(Date.create('08-25-1978 1:42am'), new Date(1978, 7, 25, 1, 42), 'Date#create | Date/Time | 1am minutes and am/pm');
dateEqual(Date.create('08-25-1978 1:42:32am'), new Date(1978, 7, 25, 1, 42, 32), 'Date#create | Date/Time | 1am seconds and am/pm');
dateEqual(Date.create('08-25-1978 1:42:32.488am'), new Date(1978, 7, 25, 1, 42, 32, 488), 'Date#create | Date/Time | 1am seconds and am/pm');
dateEqual(Date.create('08-25-1978 11pm'), new Date(1978, 7, 25, 23), 'Date#create | Date/Time | 11pm am/pm');
dateEqual(Date.create('08-25-1978 11:42pm'), new Date(1978, 7, 25, 23, 42), 'Date#create | Date/Time | 11pm minutes and am/pm');
dateEqual(Date.create('08-25-1978 11:42:32pm'), new Date(1978, 7, 25, 23, 42, 32), 'Date#create | Date/Time | 11pm seconds and am/pm');
dateEqual(Date.create('08-25-1978 11:42:32.488pm'), new Date(1978, 7, 25, 23, 42, 32, 488), 'Date#create | Date/Time | 11pm seconds and am/pm');
dateEqual(Date.create('08-25-1978 11am'), new Date(1978, 7, 25, 11), 'Date#create | Date/Time | 11am am/pm');
dateEqual(Date.create('08-25-1978 11:42am'), new Date(1978, 7, 25, 11, 42), 'Date#create | Date/Time | 11am minutes and am/pm');
dateEqual(Date.create('08-25-1978 11:42:32am'), new Date(1978, 7, 25, 11, 42, 32), 'Date#create | Date/Time | 11am seconds and am/pm');
dateEqual(Date.create('08-25-1978 11:42:32.488am'), new Date(1978, 7, 25, 11, 42, 32, 488), 'Date#create | Date/Time | 11am seconds and am/pm');
dateEqual(Date.create('2010-11-22T22:59Z'), getUTCDate(2010,11,22,22,59), 'Date#create | ISO8601 | full with UTC timezone');
dateEqual(Date.create('1997-07-16T19:20+00:00'), getUTCDate(1997, 7, 16, 19, 20), 'Date#create | ISO8601 | zero minutes with timezone');
dateEqual(Date.create('1997-07-16T19:20+01:00'), getUTCDate(1997, 7, 16, 18, 20), 'Date#create | ISO8601 | minutes with timezone');
dateEqual(Date.create('1997-07-16T19:20:30+01:00'), getUTCDate(1997, 7, 16, 18, 20, 30), 'Date#create | ISO8601 | seconds with timezone');
dateEqual(Date.create('1997-07-16T19:20:30.45+01:00'), getUTCDate(1997, 7, 16, 18, 20, 30, 450), 'Date#create | ISO8601 | milliseconds with timezone');
dateEqual(Date.create('1994-11-05T08:15:30-05:00'), getUTCDate(1994, 11, 5, 13, 15, 30), 'Date#create | ISO8601 | Full example 1');
dateEqual(Date.create('1994-11-05T13:15:30Z'), getUTCDate(1994, 11, 5, 13, 15, 30), 'Date#create | ISO8601 | Full example 1');
equal(Date.create('1994-11-05T13:15:30Z')._utc, false, 'Date#create | ISO8601 | does not forcefully set UTC flag');
dateEqual(Date.create('1776-05-23T02:45:08-08:30'), getUTCDate(1776, 5, 23, 11, 15, 08), 'Date#create | ISO8601 | Full example 3');
dateEqual(Date.create('1776-05-23T02:45:08+08:30'), getUTCDate(1776, 5, 22, 18, 15, 08), 'Date#create | ISO8601 | Full example 4');
dateEqual(Date.create('1776-05-23T02:45:08-0830'), getUTCDate(1776, 5, 23, 11, 15, 08), 'Date#create | ISO8601 | Full example 5');
dateEqual(Date.create('1776-05-23T02:45:08+0830'), getUTCDate(1776, 5, 22, 18, 15, 08), 'Date#create | ISO8601 | Full example 6');
// No limit on the number of millisecond decimals, so....
dateEqual(Date.create('1997-07-16T19:20:30.4+01:00'), getUTCDate(1997, 7, 16, 18, 20, 30, 400), 'Date#create | ISO8601 | milliseconds have no limit 1');
dateEqual(Date.create('1997-07-16T19:20:30.46+01:00'), getUTCDate(1997, 7, 16, 18, 20, 30, 460), 'Date#create | ISO8601 | milliseconds have no limit 2');
dateEqual(Date.create('1997-07-16T19:20:30.462+01:00'), getUTCDate(1997, 7, 16, 18, 20, 30, 462), 'Date#create | ISO8601 | milliseconds have no limit 3');
dateEqual(Date.create('1997-07-16T19:20:30.4628+01:00'), getUTCDate(1997, 7, 16, 18, 20, 30, 463), 'Date#create | ISO8601 | milliseconds have no limit 4');
dateEqual(Date.create('1997-07-16T19:20:30.46284+01:00'), getUTCDate(1997, 7, 16, 18, 20, 30, 463), 'Date#create | ISO8601 | milliseconds have no limit 5');
// .NET output
dateEqual(Date.create('2012-04-23T07:58:42.7940000z'), getUTCDate(2012, 4, 23, 7, 58, 42, 794), 'Date#create | ISO8601 | .NET long format');
// Fractions in ISO8601 dates
dateEqual(Date.create('1997-07-16T14:30:40.5'), new Date(1997, 6, 16, 14, 30, 40, 500), 'Date#create | ISO8601 | fractions in seconds');
dateEqual(Date.create('1997-07-16T14:30.5'), new Date(1997, 6, 16, 14, 30, 30), 'Date#create | ISO8601 | fractions in minutes');
// Comma based fractions in ISO8601 dates
dateEqual(Date.create('1997-07-16T14:30:40,5'), new Date(1997, 6, 16, 14, 30, 40, 500), 'Date#create | ISO8601 | fractions in seconds');
dateEqual(Date.create('1997-07-16T14:30,5'), new Date(1997, 6, 16, 14, 30, 30), 'Date#create | ISO8601 | fractions in minutes');
// Fractional hours in ISO dates
dateEqual(Date.create('1997-07-16T14.5'), new Date(1997, 6, 16, 14, 30), 'Date#create | ISO8601 | fractions in hours');
dateEqual(Date.create('1997-07-16T14,5'), new Date(1997, 6, 16, 14, 30), 'Date#create | ISO8601 | fractions in hours');
// These are all the same moment...
dateEqual(Date.create('2001-04-03T18:30Z'), getUTCDate(2001,4,3,18,30), 'Date#create | ISO8601 | Synonymous dates with timezone 1');
dateEqual(Date.create('2001-04-03T22:30+04'), getUTCDate(2001,4,3,18,30), 'Date#create | ISO8601 | Synonymous dates with timezone 2');
dateEqual(Date.create('2001-04-03T1130-0700'), getUTCDate(2001,4,3,18,30), 'Date#create | ISO8601 | Synonymous dates with timezone 3');
dateEqual(Date.create('2001-04-03T15:00-03:30'), getUTCDate(2001,4,3,18,30), 'Date#create | ISO8601 | Synonymous dates with timezone 4');
dateEqual(Date.create('\/Date(628318530718)\/'), new Date(628318530718), 'Date#create | handles JSON date format');
dateEqual(Date.create('\/Date(1318287600+0100)\/'), new Date(1318287600), 'Date#create | handles JSON date format with timezone');
// Fuzzy dates
dateEqual(Date.create('now'), new Date(), 'Date#create | Fuzzy Dates | Now');
dateEqual(Date.create('Just now'), new Date(), 'Date#create | Fuzzy Dates | Just Now');
dateEqual(Date.create('today'), new Date(now.getFullYear(), now.getMonth(), now.getDate()), 'Date#create | Fuzzy Dates | Today');
dateEqual(Date.create('yesterday'), new Date(now.getFullYear(), now.getMonth(), now.getDate() - 1), 'Date#create | Fuzzy Dates | Yesterday');
dateEqual(Date.create('tomorrow'), new Date(now.getFullYear(), now.getMonth(), now.getDate() + 1), 'Date#create | Fuzzy Dates | Tomorrow');
dateEqual(Date.create('4pm'), new Date(now.getFullYear(), now.getMonth(), now.getDate(), 16), 'Date#create | Fuzzy Dates | 4pm');
dateEqual(Date.create('today at 4pm'), new Date(now.getFullYear(), now.getMonth(), now.getDate(), 16), 'Date#create | Fuzzy Dates | Today at 4pm');
dateEqual(Date.create('today at 4 pm'), new Date(now.getFullYear(), now.getMonth(), now.getDate(), 16), 'Date#create | Fuzzy Dates | Today at 4 pm');
dateEqual(Date.create('4pm today'), new Date(now.getFullYear(), now.getMonth(), now.getDate(), 16), 'Date#create | Fuzzy Dates | 4pm today');
dateEqual(Date.create('The day after tomorrow'), new Date(now.getFullYear(), now.getMonth(), now.getDate() + 2), 'Date#create | Fuzzy Dates | The day after tomorrow');
dateEqual(Date.create('The day before yesterday'), new Date(now.getFullYear(), now.getMonth(), now.getDate() - 2), 'Date#create | Fuzzy Dates | The day before yesterday');
dateEqual(Date.create('One day after tomorrow'), new Date(now.getFullYear(), now.getMonth(), now.getDate() + 2), 'Date#create | Fuzzy Dates | One day after tomorrow');
dateEqual(Date.create('One day before yesterday'), new Date(now.getFullYear(), now.getMonth(), now.getDate() - 2), 'Date#create | Fuzzy Dates | One day before yesterday');
dateEqual(Date.create('Two days after tomorrow'), new Date(now.getFullYear(), now.getMonth(), now.getDate() + 3), 'Date#create | Fuzzy Dates | Two days after tomorrow');
dateEqual(Date.create('Two days before yesterday'), new Date(now.getFullYear(), now.getMonth(), now.getDate() - 3), 'Date#create | Fuzzy Dates | Two days before yesterday');
dateEqual(Date.create('Two days after today'), new Date(now.getFullYear(), now.getMonth(), now.getDate() + 2), 'Date#create | Fuzzy Dates | Two days after today');
dateEqual(Date.create('Two days before today'), new Date(now.getFullYear(), now.getMonth(), now.getDate() - 2), 'Date#create | Fuzzy Dates | Two days before today');
dateEqual(Date.create('Two days from today'), new Date(now.getFullYear(), now.getMonth(), now.getDate() + 2), 'Date#create | Fuzzy Dates | Two days from today');
dateEqual(Date.create('tWo dAyS after toMoRRoW'), new Date(now.getFullYear(), now.getMonth(), now.getDate() + 3), 'Date#create | Fuzzy Dates | tWo dAyS after toMoRRoW');
dateEqual(Date.create('2 days after tomorrow'), new Date(now.getFullYear(), now.getMonth(), now.getDate() + 3), 'Date#create | Fuzzy Dates | 2 days after tomorrow');
dateEqual(Date.create('2 day after tomorrow'), new Date(now.getFullYear(), now.getMonth(), now.getDate() + 3), 'Date#create | Fuzzy Dates | 2 day after tomorrow');
dateEqual(Date.create('18 days after tomorrow'), new Date(now.getFullYear(), now.getMonth(), now.getDate() + 19), 'Date#create | Fuzzy Dates | 18 days after tomorrow');
dateEqual(Date.create('18 day after tomorrow'), new Date(now.getFullYear(), now.getMonth(), now.getDate() + 19), 'Date#create | Fuzzy Dates | 18 day after tomorrow');
dateEqual(Date.create('2 years ago'), getRelativeDate(-2), 'Date#create | Fuzzy Dates | 2 years ago');
dateEqual(Date.create('2 months ago'), getRelativeDate(null, -2), 'Date#create | Fuzzy Dates | 2 months ago');
dateEqual(Date.create('2 weeks ago'), getRelativeDate(null, null, -14), 'Date#create | Fuzzy Dates | 2 weeks ago');
dateEqual(Date.create('2 days ago'), getRelativeDate(null, null, -2), 'Date#create | Fuzzy Dates | 2 days ago');
dateEqual(Date.create('2 hours ago'), getRelativeDate(null, null, null, -2), 'Date#create | Fuzzy Dates | 2 hours ago');
dateEqual(Date.create('2 minutes ago'), getRelativeDate(null, null, null, null, -2), 'Date#create | Fuzzy Dates | 2 minutes ago');
dateEqual(Date.create('2 seconds ago'), getRelativeDate(null, null, null, null, null, -2), 'Date#create | Fuzzy Dates | 2 seconds ago');
dateEqual(Date.create('2 milliseconds ago'), getRelativeDate(null, null, null, null, null, null, -2), 'Date#create | Fuzzy Dates | 2 milliseconds ago');
dateEqual(Date.create('a second ago'), getRelativeDate(null, null, null, null, null, -1), 'Date#create | Fuzzy Dates | a second ago');
dateEqual(Date.create('2 years from now'), getRelativeDate(2), 'Date#create | Fuzzy Dates | 2 years from now');
dateEqual(Date.create('2 months from now'), getRelativeDate(null, 2), 'Date#create | Fuzzy Dates | 2 months from now');
dateEqual(Date.create('2 weeks from now'), getRelativeDate(null, null, 14), 'Date#create | Fuzzy Dates | 2 weeks from now');
dateEqual(Date.create('2 days from now'), getRelativeDate(null, null, 2), 'Date#create | Fuzzy Dates | 2 days from now');
dateEqual(Date.create('2 hours from now'), getRelativeDate(null, null, null, 2), 'Date#create | Fuzzy Dates | 2 hours from now');
dateEqual(Date.create('2 minutes from now'), getRelativeDate(null, null, null, null, 2), 'Date#create | Fuzzy Dates | 2 minutes from now');
dateEqual(Date.create('2 seconds from now'), getRelativeDate(null, null, null, null, null, 2), 'Date#create | Fuzzy Dates | 2 seconds from now');
dateEqual(Date.create('2 milliseconds from now'), getRelativeDate(null, null, null, null, null, null, 2), 'Date#create | Fuzzy Dates | 2 milliseconds from now');
dateEqual(Date.create('2 years later'), getRelativeDate(2), 'Date#create | Fuzzy Dates | 2 years later');
dateEqual(Date.create('2 months later'), getRelativeDate(null, 2), 'Date#create | Fuzzy Dates | 2 months later');
dateEqual(Date.create('2 weeks later'), getRelativeDate(null, null, 14), 'Date#create | Fuzzy Dates | 2 weeks later');
dateEqual(Date.create('2 days later'), getRelativeDate(null, null, 2), 'Date#create | Fuzzy Dates | 2 days later');
dateEqual(Date.create('2 hours later'), getRelativeDate(null, null, null, 2), 'Date#create | Fuzzy Dates | 2 hours later');
dateEqual(Date.create('2 minutes later'), getRelativeDate(null, null, null, null, 2), 'Date#create | Fuzzy Dates | 2 minutes later');
dateEqual(Date.create('2 seconds later'), getRelativeDate(null, null, null, null, null, 2), 'Date#create | Fuzzy Dates | 2 seconds later');
dateEqual(Date.create('2 milliseconds later'), getRelativeDate(null, null, null, null, null, null, 2), 'Date#create | Fuzzy Dates | 2 milliseconds later');
// Article trouble
dateEqual(Date.create('an hour ago'), getRelativeDate(null, null, null, -1), 'Date#create | Fuzzy Dates | an hours ago');
dateEqual(Date.create('an hour from now'), getRelativeDate(null, null, null, 1), 'Date#create | Fuzzy Dates | an hour from now');
dateEqual(Date.create('Monday'), getDateWithWeekdayAndOffset(1), 'Date#create | Fuzzy Dates | Monday');
dateEqual(Date.create('The day after Monday'), getDateWithWeekdayAndOffset(2), 'Date#create | Fuzzy Dates | The day after Monday');
dateEqual(Date.create('The day before Monday'), getDateWithWeekdayAndOffset(0), 'Date#create | Fuzzy Dates | The day before Monday');
dateEqual(Date.create('2 days after monday'), getDateWithWeekdayAndOffset(3), 'Date#create | Fuzzy Dates | 2 days after monday');
dateEqual(Date.create('2 days before monday'), getDateWithWeekdayAndOffset(6, -7), 'Date#create | Fuzzy Dates | 2 days before monday');
dateEqual(Date.create('2 weeks after monday'), getDateWithWeekdayAndOffset(1, 14), 'Date#create | Fuzzy Dates | 2 weeks after monday');
dateEqual(Date.create('Next Monday'), getDateWithWeekdayAndOffset(1, 7), 'Date#create | Fuzzy Dates | Next Monday');
dateEqual(Date.create('next week monday'), getDateWithWeekdayAndOffset(1, 7), 'Date#create | Fuzzy Dates | next week monday');
dateEqual(Date.create('Next friDay'), getDateWithWeekdayAndOffset(5, 7), 'Date#create | Fuzzy Dates | Next friDay');
dateEqual(Date.create('next week thursday'), getDateWithWeekdayAndOffset(4, 7), 'Date#create | Fuzzy Dates | next week thursday');
dateEqual(Date.create('last Monday'), getDateWithWeekdayAndOffset(1, -7), 'Date#create | Fuzzy Dates | last Monday');
dateEqual(Date.create('last week monday'), getDateWithWeekdayAndOffset(1, -7), 'Date#create | Fuzzy Dates | last week monday');
dateEqual(Date.create('last friDay'), getDateWithWeekdayAndOffset(5, -7), 'Date#create | Fuzzy Dates | last friDay');
dateEqual(Date.create('last week thursday'), getDateWithWeekdayAndOffset(4, -7), 'Date#create | Fuzzy Dates | last week thursday');
dateEqual(Date.create('last Monday at 4pm'), getDateWithWeekdayAndOffset(1, -7, 16), 'Date#create | Fuzzy Dates | last Monday at 4pm');
dateEqual(Date.create('this Monday'), getDateWithWeekdayAndOffset(1, 0), 'Date#create | Fuzzy Dates | this Monday');
dateEqual(Date.create('this week monday'), getDateWithWeekdayAndOffset(1, 0), 'Date#create | Fuzzy Dates | this week monday');
dateEqual(Date.create('this friDay'), getDateWithWeekdayAndOffset(5, 0), 'Date#create | Fuzzy Dates | this friDay');
dateEqual(Date.create('this week thursday'), getDateWithWeekdayAndOffset(4, 0), 'Date#create | Fuzzy Dates | this week thursday');
dateEqual(Date.create('Monday of last week'), getDateWithWeekdayAndOffset(1, -7), 'Date#create | Fuzzy Dates | Monday of last week');
dateEqual(Date.create('saturday of next week'), getDateWithWeekdayAndOffset(6, 7), 'Date#create | Fuzzy Dates | saturday of next week');
dateEqual(Date.create('Monday last week'), getDateWithWeekdayAndOffset(1, -7), 'Date#create | Fuzzy Dates | Monday last week');
dateEqual(Date.create('saturday next week'), getDateWithWeekdayAndOffset(6, 7), 'Date#create | Fuzzy Dates | saturday next week');
dateEqual(Date.create('Monday of this week'), getDateWithWeekdayAndOffset(1, 0), 'Date#create | Fuzzy Dates | Monday of this week');
dateEqual(Date.create('saturday of this week'), getDateWithWeekdayAndOffset(6, 0), 'Date#create | Fuzzy Dates | saturday of this week');
dateEqual(Date.create('Monday this week'), getDateWithWeekdayAndOffset(1, 0), 'Date#create | Fuzzy Dates | Monday this week');
dateEqual(Date.create('saturday this week'), getDateWithWeekdayAndOffset(6, 0), 'Date#create | Fuzzy Dates | saturday this week');
dateEqual(Date.create('Tue of last week'), getDateWithWeekdayAndOffset(2, -7), 'Date#create | Fuzzy Dates | Tue of last week');
dateEqual(Date.create('Tue. of last week'), getDateWithWeekdayAndOffset(2, -7), 'Date#create | Fuzzy Dates | Tue. of last week');
dateEqual(Date.create('Next week'), getRelativeDate(null, null, 7), 'Date#create | Fuzzy Dates | Next week');
dateEqual(Date.create('Last week'), getRelativeDate(null, null, -7), 'Date#create | Fuzzy Dates | Last week');
dateEqual(Date.create('Next month'), getRelativeDate(null, 1), 'Date#create | Fuzzy Dates | Next month');
dateEqual(Date.create('Next year'), getRelativeDate(1), 'Date#create | Fuzzy Dates | Next year');
dateEqual(Date.create('this year'), getRelativeDate(0), 'Date#create | Fuzzy Dates | this year');
dateEqual(Date.create('beginning of the week'), getDateWithWeekdayAndOffset(0), 'Date#create | Fuzzy Dates | beginning of the week');
dateEqual(Date.create('beginning of this week'), getDateWithWeekdayAndOffset(0), 'Date#create | Fuzzy Dates | beginning of this week');
dateEqual(Date.create('end of this week'), getDateWithWeekdayAndOffset(6, 0, 23, 59, 59, 999), 'Date#create | Fuzzy Dates | end of this week');
dateEqual(Date.create('beginning of next week'), getDateWithWeekdayAndOffset(0, 7), 'Date#create | Fuzzy Dates | beginning of next week');
dateEqual(Date.create('the beginning of next week'), getDateWithWeekdayAndOffset(0, 7), 'Date#create | Fuzzy Dates | the beginning of next week');
dateEqual(Date.create('beginning of the month'), new Date(now.getFullYear(), now.getMonth()), 'Date#create | Fuzzy Dates | beginning of the month');
dateEqual(Date.create('beginning of this month'), new Date(now.getFullYear(), now.getMonth()), 'Date#create | Fuzzy Dates | beginning of this month');
dateEqual(Date.create('beginning of next month'), new Date(now.getFullYear(), now.getMonth() + 1), 'Date#create | Fuzzy Dates | beginning of next month');
dateEqual(Date.create('the beginning of next month'), new Date(now.getFullYear(), now.getMonth() + 1), 'Date#create | Fuzzy Dates | the beginning of next month');
dateEqual(Date.create('the end of next month'), new Date(now.getFullYear(), now.getMonth() + 1, getDaysInMonth(now.getFullYear(), now.getMonth() + 1), 23, 59, 59, 999), 'Date#create | Fuzzy Dates | the end of next month');
dateEqual(Date.create('the end of the month'), new Date(now.getFullYear(), now.getMonth(), getDaysInMonth(now.getFullYear(), now.getMonth()), 23, 59, 59, 999), 'Date#create | Fuzzy Dates | the end of the month');
dateEqual(Date.create('the beginning of the year'), new Date(now.getFullYear(), 0), 'Date#create | Fuzzy Dates | the beginning of the year');
dateEqual(Date.create('the beginning of this year'), new Date(now.getFullYear(), 0), 'Date#create | Fuzzy Dates | the beginning of this year');
dateEqual(Date.create('the beginning of next year'), new Date(now.getFullYear() + 1, 0), 'Date#create | Fuzzy Dates | the beginning of next year');
dateEqual(Date.create('the beginning of last year'), new Date(now.getFullYear() - 1, 0), 'Date#create | Fuzzy Dates | the beginning of last year');
dateEqual(Date.create('the end of next year'), new Date(now.getFullYear() + 1, 11, 31, 23, 59, 59, 999), 'Date#create | Fuzzy Dates | the end of next year');
dateEqual(Date.create('the end of last year'), new Date(now.getFullYear() - 1, 11, 31, 23, 59, 59, 999), 'Date#create | Fuzzy Dates | the end of last year');
dateEqual(Date.create('the beginning of the day'), new Date(now.getFullYear(), now.getMonth(), now.getDate()), 'Date#create | Fuzzy Dates | the beginning of the day');
dateEqual(Date.create('beginning of March'), new Date(now.getFullYear(), 2), 'Date#create | Fuzzy Dates | beginning of March');
dateEqual(Date.create('end of March'), new Date(now.getFullYear(), 2, 31, 23, 59, 59, 999), 'Date#create | Fuzzy Dates | end of March');
dateEqual(Date.create('the first day of March'), new Date(now.getFullYear(), 2), 'Date#create | Fuzzy Dates | the first day of March');
dateEqual(Date.create('the last day of March'), new Date(now.getFullYear(), 2, 31), 'Date#create | Fuzzy Dates | the last day of March');
dateEqual(Date.create('beginning of 1998'), new Date(1998, 0), 'Date#create | Fuzzy Dates | beginning of 1998');
dateEqual(Date.create('end of 1998'), new Date(1998, 11, 31, 23, 59, 59, 999), 'Date#create | Fuzzy Dates | end of 1998');
dateEqual(Date.create('the first day of 1998'), new Date(1998, 0), 'Date#create | Fuzzy Dates | the first day of 1998');
dateEqual(Date.create('the last day of 1998'), new Date(1998, 11, 31), 'Date#create | Fuzzy Dates | the last day of 1998');
dateEqual(Date.create('The 15th of last month.'), new Date(now.getFullYear(), now.getMonth() - 1, 15), 'Date#create | Fuzzy Dates | The 15th of last month');
dateEqual(Date.create('January 30th of last year.'), new Date(now.getFullYear() - 1, 0, 30), 'Date#create | Fuzzy Dates | January 30th of last year');
dateEqual(Date.create('January of last year.'), new Date(now.getFullYear() - 1, 0), 'Date#create | Fuzzy Dates | January of last year');
dateEqual(Date.create('First day of may'), new Date(now.getFullYear(), 4, 1), 'Date#create | Fuzzy Dates | First day of may');
dateEqual(Date.create('Last day of may'), new Date(now.getFullYear(), 4, 31), 'Date#create | Fuzzy Dates | Last day of may');
dateEqual(Date.create('Last day of next month'), new Date(now.getFullYear(), now.getMonth() + 1, getDaysInMonth(now.getFullYear(), now.getMonth() + 1)), 'Date#create | Fuzzy Dates | Last day of next month');
dateEqual(Date.create('Last day of november'), new Date(now.getFullYear(), 10, 30), 'Date#create | Fuzzy Dates | Last day of november');
// Just the time
dateEqual(Date.create('1pm'), new Date(now.getFullYear(), now.getMonth(), now.getDate(), 13), 'Date#create | ISO8601 | 1pm');
dateEqual(Date.create('1:30pm'), new Date(now.getFullYear(), now.getMonth(), now.getDate(), 13, 30), 'Date#create | ISO8601 | 1:30pm');
dateEqual(Date.create('1:30:22pm'), new Date(now.getFullYear(), now.getMonth(), now.getDate(), 13, 30, 22), 'Date#create | ISO8601 | 1:30:22pm');
dateEqual(Date.create('1:30:22.432pm'), new Date(now.getFullYear(), now.getMonth(), now.getDate(), 13, 30, 22, 432), 'Date#create | ISO8601 | 1:30:22.432pm');
dateEqual(Date.create('17:48:03.947'), new Date(now.getFullYear(), now.getMonth(), now.getDate(), 17, 48, 3, 947), 'Date#create | ISO8601 | 17:48:03.947');
dateEqual(Date.create('the first day of next January'), new Date(now.getFullYear() + 1, 0, 1), 'Date#create | Fuzzy Dates | the first day of next january');
var d;
d = new Date('August 25, 2010 11:45:20');
d.set(2008, 5, 18, 4, 25, 30, 400);
equal(d.getFullYear(), 2008, 'Date#set | year');
equal(d.getMonth(), 5, 'Date#set | month');
equal(d.getDate(), 18, 'Date#set | date');
equal(d.getHours(), 4, 'Date#set | hours');
equal(d.getMinutes(), 25, 'Date#set | minutes');
equal(d.getSeconds(), 30, 'Date#set | seconds');
equal(d.getMilliseconds(), 400, 'Date#set | milliseconds');
d = new Date('August 25, 2010 11:45:20');
d.set({ year: 2008, month: 5, date: 18, hour: 4, minute: 25, second: 30, millisecond: 400 });
equal(d.getFullYear(), 2008, 'Date#set | object | year');
equal(d.getMonth(), 5, 'Date#set | object | month');
equal(d.getDate(), 18, 'Date#set | object | date');
equal(d.getHours(), 4, 'Date#set | object | hours');
equal(d.getMinutes(), 25, 'Date#set | object | minutes');
equal(d.getSeconds(), 30, 'Date#set | object | seconds');
equal(d.getMilliseconds(), 400, 'Date#set | object | milliseconds');
d = new Date('August 25, 2010 11:45:20');
d.set({ years: 2008, months: 5, date: 18, hours: 4, minutes: 25, seconds: 30, milliseconds: 400 });
equal(d.getFullYear(), 2008, 'Date#set | object plural | year');
equal(d.getMonth(), 5, 'Date#set | object plural | month');
equal(d.getDate(), 18, 'Date#set | object plural | date');
equal(d.getHours(), 4, 'Date#set | object plural | hours');
equal(d.getMinutes(), 25, 'Date#set | object plural | minutes');
equal(d.getSeconds(), 30, 'Date#set | object plural | seconds');
equal(d.getMilliseconds(), 400, 'Date#set | object plural | milliseconds');
d.set({ weekday: 2 });
equal(d.getDate(), 17, 'Date#set | object | weekday 2');
d.set({ weekday: 5 });
equal(d.getDate(), 20, 'Date#set | object | weekday 5');
d.set({ weekday: 2 }, true);
equal(d.getDate(), 17, 'Date#set | object | reset time | weekday 2');
d.set({ weekday: 5 }, true);
equal(d.getDate(), 20, 'Date#set | object | reset time | weekday 5');
d = new Date('August 25, 2010 11:45:20');
d.set({ years: 2005, hours: 2 });
equal(d.getFullYear(), 2005, 'Date#set | no reset | year');
equal(d.getMonth(), 7, 'Date#set | no reset | month');
equal(d.getDate(), 25, 'Date#set | no reset | date');
equal(d.getHours(), 2, 'Date#set | no reset | hours');
equal(d.getMinutes(), 45, 'Date#set | no reset | minutes');
equal(d.getSeconds(), 20, 'Date#set | no reset | seconds');
equal(d.getMilliseconds(), 0, 'Date#set | no reset | milliseconds');
d = new Date('August 25, 2010 11:45:20');
d.set({ years: 2008, hours: 4 }, true);
equal(d.getFullYear(), 2008, 'Date#set | reset | year');
equal(d.getMonth(), 7, 'Date#set | reset | month');
equal(d.getDate(), 25, 'Date#set | reset | date');
equal(d.getHours(), 4, 'Date#set | reset | hours');
equal(d.getMinutes(), 0, 'Date#set | reset | minutes');
equal(d.getSeconds(), 0, 'Date#set | reset | seconds');
equal(d.getMilliseconds(), 0, 'Date#set | reset | milliseconds');
d = new Date('August 25, 2010 11:45:20').utc();
d.set({ years: 2008, hours: 4 }, true);
equal(d.getFullYear(), 2008, 'Date#set | utc | reset utc | year');
equal(d.getMonth(), 7, 'Date#set | utc | reset utc | month');
equal(d.getDate(), d.getTimezoneOffset() > 240 ? 24 : 25, 'Date#set | utc | reset utc | date');
equal(d.getHours(), getHours(4 - (d.getTimezoneOffset() / 60)), 'Date#set | utc | reset utc | hours');
equal(d.getMinutes(), Math.abs(d.getTimezoneOffset() % 60), 'Date#set | utc | reset utc | minutes');
equal(d.getSeconds(), 0, 'Date#set | utc | reset utc | seconds');
equal(d.getMilliseconds(), 0, 'Date#set | utc | reset utc | milliseconds');
d = new Date('August 25, 2010 11:45:20').utc();
d.set({ years: 2005, hours: 2 }, false);
equal(d.getFullYear(), 2005, 'Date#set | utc | no reset utc | year');
equal(d.getMonth(), 7, 'Date#set | utc | no reset utc | month');
equal(d.getDate(), d.getTimezoneOffset() >= 135 ? 24 : 25, 'Date#set | utc | no reset utc | date');
equal(d.getHours(), getHours(2 - (d.getTimezoneOffset() / 60)), 'Date#set | utc | no reset utc | hours');
equal(d.getMinutes(), 45, 'Date#set | utc | no reset utc | minutes');
equal(d.getSeconds(), 20, 'Date#set | utc | no reset utc | seconds');
equal(d.getMilliseconds(), 0, 'Date#set | utc | no reset utc | milliseconds');
d = new Date('August 25, 2010 11:45:20').utc();
d.set({ years: 2005, hours: 2 }, false);
equal(d.getFullYear(), 2005, 'Date#set | utc | no reset | year');
equal(d.getMonth(), 7, 'Date#set | utc | no reset | month');
equal(d.getDate(), d.getTimezoneOffset() >= 135 ? 24 : 25, 'Date#set | utc | no reset | date');
equal(d.getHours(), getHours(2 - (d.getTimezoneOffset() / 60)), 'Date#set | utc | no reset | hours');
equal(d.getMinutes(), 45, 'Date#set | utc | no reset | minutes');
equal(d.getSeconds(), 20, 'Date#set | utc | no reset | seconds');
equal(d.getMilliseconds(), 0, 'Date#set | utc | no reset | milliseconds');
dateEqual(Date.create('Next week'), getRelativeDate(null, null, 7), 'Date#create | Fuzzy Dates | Next week');
d = new Date('August 25, 2010 11:45:20');
equal(d.getWeekday(), 3, 'Date#getWeekday | wednesday');
d.setWeekday(0);
equal(d.getDate(), 22, 'Date#setWeekday | sunday');
d.setWeekday(1);
equal(d.getDate(), 23, 'Date#setWeekday | monday');
d.setWeekday(2);
equal(d.getDate(), 24, 'Date#setWeekday | tuesday');
d.setWeekday(3);
equal(d.getDate(), 25, 'Date#setWeekday | wednesday');
d.setWeekday(4);
equal(d.getDate(), 26, 'Date#setWeekday | thursday');
d.setWeekday(5);
equal(d.getDate(), 27, 'Date#setWeekday | friday');
d.setWeekday(6);
equal(d.getDate(), 28, 'Date#setWeekday | saturday');
equal(d.setWeekday(6), d.getTime(), 'Date#setWeekday | should return the timestamp');
d = new Date('August 25, 2010 11:45:20').utc();
equal(d.getWeekday(), 3, 'Date#getUTCWeekday | wednesday');
d.setWeekday(0);
equal(d.getDate(), 22, 'Date#setWeekday | utc | sunday');
d.setWeekday(1);
equal(d.getDate(), 23, 'Date#setWeekday | utc | monday');
d.setWeekday(2);
equal(d.getDate(), 24, 'Date#setWeekday | utc | tuesday');
d.setWeekday(3);
equal(d.getDate(), 25, 'Date#setWeekday | utc | wednesday');
d.setWeekday(4);
equal(d.getDate(), 26, 'Date#setWeekday | utc | thursday');
d.setWeekday(5);
equal(d.getDate(), 27, 'Date#setWeekday | utc | friday');
d.setWeekday(6);
equal(d.getDate(), 28, 'Date#setWeekday | utc | saturday');
equal(d.setWeekday(6), d.getTime(), 'Date#setWeekday | utc | should return the timestamp');
d = new Date('August 25, 2010 11:45:20');
d.setDate(12);
equal(d.getWeekday(), 4, 'Date#getWeekday | Thursday');
equal(d.clone().utc().getWeekday(), 4, 'Date#setWeekday | utc | Thursday');
d.setDate(13);
equal(d.getWeekday(), 5, 'Date#getWeekday | Friday');
equal(d.clone().utc().getWeekday(), 5, 'Date#setWeekday | utc | Friday');
d.setDate(14);
equal(d.getWeekday(), 6, 'Date#getWeekday | Saturday');
equal(d.clone().utc().getWeekday(), 6, 'Date#getWeekday | utc | Saturday');
d.setDate(15);
equal(d.getWeekday(), 0, 'Date#getWeekday | Sunday');
equal(d.clone().utc().getWeekday(), 0, 'Date#getWeekday | utc | Sunday');
d.setDate(16);
equal(d.getWeekday(), 1, 'Date#getWeekday | Monday');
equal(d.clone().utc().getWeekday(), 1, 'Date#getWeekday | utc | Monday');
d.setDate(17);
equal(d.getWeekday(), 2, 'Date#getWeekday | Tuesday');
equal(d.clone().utc().getWeekday(), 2, 'Date#getWeekday | utc | Tuesday');
d.setDate(18);
equal(d.getWeekday(), 3, 'Date#getWeekday | Wednesday');
equal(d.clone().utc().getWeekday(), 3, 'Date#getWeekday | utc | Wednesday');
dateEqual(new Date().advance({ weekday: 7 }), new Date(), 'Date#advance | cannot advance by weekdays');
dateEqual(new Date().rewind({ weekday: 7 }), new Date(), 'Date#advance | cannot rewind by weekdays');
// UTC Date
var d = Date.utc.create('2010-01-01 03:00', 'en').utc();
d.setWeekday(1)
equal(d.getUTCDay(), 1, 'Date#setWeekday | should account for UTC shift | getUTCDay');
var d = new Date(2010, 11, 31, 24, 59, 59);
equal(d.getWeekday(), d.getDay(), 'Date#getWeekday | equal to getDay');
equal(d.getUTCWeekday(), d.getUTCDay(), 'Date#getUTCWeekday | equal to getUTCDay');