mirror of
https://github.com/mozilla/gecko-dev.git
synced 2025-02-04 13:07:52 +00:00
Checked in patches for bug 232114: Outlook csv import expects dates as mm/dd/yyyy - outlook export dates seem locale specific
This commit is contained in:
parent
af7af70c6e
commit
6f76675ee8
@ -143,26 +143,43 @@ DateUtils.getWeekNumber = function(date)
|
||||
var NumWeeks = IsFirstWeek+ComplNumWeeks+1;
|
||||
if(RemainingDays)
|
||||
{
|
||||
if(NumWeeks>52 && NumWeeks>NumberOfWeeksThisYear )
|
||||
return( 1 );
|
||||
else
|
||||
return( NumWeeks );
|
||||
if(NumWeeks>52 && NumWeeks>NumberOfWeeksThisYear )
|
||||
return( 1 );
|
||||
else
|
||||
return( NumWeeks );
|
||||
}
|
||||
else
|
||||
return( NumWeeks - 1 );
|
||||
return( NumWeeks - 1 );
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
function DateFormater( )
|
||||
{
|
||||
// we get the date bundle in case the locale changes, can
|
||||
// we be notified of a locale change instead, then we could
|
||||
// get the bundle once.
|
||||
|
||||
this.dateStringBundle = srGetStrBundle("chrome://calendar/locale/dateFormat.properties");
|
||||
// we get the date bundle in case the locale changes, can
|
||||
// we be notified of a locale change instead, then we could
|
||||
// get the bundle once.
|
||||
this.dateStringBundle = srGetStrBundle("chrome://calendar/locale/dateFormat.properties");
|
||||
|
||||
// probe the dateformat
|
||||
this.yearIndex = -1;
|
||||
this.monthIndex = -1;
|
||||
this.dayIndex = -1;
|
||||
this.twoDigitYear = false;
|
||||
|
||||
var parseShortDateRegex = /^\s*(\d+)\D(\d+)\D(\d+)\s*$/; //digits & nonDigits
|
||||
var probeDate = new Date(2002,3-1,4); // month is 0-based
|
||||
var probeString = this.getShortFormatedDate(probeDate);
|
||||
|
||||
var probeArray = parseShortDateRegex.exec(probeString);
|
||||
for (var i = 1; i <= 3; i++) {
|
||||
switch (Number(probeArray[i])) {
|
||||
case 02: this.twoDigitYear = true; // fall thru
|
||||
case 2002: this.yearIndex = i; break;
|
||||
case 3: this.monthIndex = i; break;
|
||||
case 4: this.dayIndex = i; break;
|
||||
}
|
||||
}
|
||||
//All three indexes are set (not -1) at this point.
|
||||
}
|
||||
|
||||
|
||||
@ -282,50 +299,52 @@ DateFormater.prototype.getShortDayName = function( dayIndex )
|
||||
return dayName;
|
||||
}
|
||||
|
||||
/**** parseShortDate
|
||||
* Parameter dateString may be a date or a date+time. Dates are
|
||||
* read acording to locale (d-m-y or m-d-y or ...). Times are
|
||||
* read in 12- or 24-hour formats. Only hours and minutes are
|
||||
* taken into account (dateString may contain secs and msecs though).
|
||||
*/
|
||||
|
||||
DateFormater.prototype.parseShortDate = function ( dateString )
|
||||
{
|
||||
// probe for date format -- this part could be in constructor
|
||||
// probe result state:
|
||||
var parseShortDateRegex = /^\s*(\d+)\D(\d+)\D(\d+)\s*$/; //digits & nonDigits
|
||||
var parsedYearIndex = -1, parsedMonthIndex = -1, parsedDayIndex = -1;
|
||||
var parseTwoDigitYear = false;
|
||||
{ // do probe
|
||||
var probeDate = new Date(2002,3-1,4); // month is 0-based
|
||||
var probeString = this.getShortFormatedDate(probeDate);
|
||||
|
||||
var probeArray = parseShortDateRegex.exec(probeString);
|
||||
for (var i = 1; i <= 3; i++) {
|
||||
switch (Number(probeArray[i])) {
|
||||
case 02: parseTwoDigitYear = true; // fall thru
|
||||
case 2002: parsedYearIndex = i; break;
|
||||
case 3: parsedMonthIndex = i; break;
|
||||
case 4: parsedDayIndex = i; break;
|
||||
}
|
||||
}
|
||||
// all three parsed indexes are now set (no longer -1)
|
||||
}
|
||||
var parseShortDateRegex = /^\s*(\d+)\D(\d+)\D(\d+)(.*)?$/;
|
||||
var parseTimeRegex = /\s*(\d+)\D(\d+)(\d|\W)*(pm|PM|am|AM|)\s*$/;
|
||||
|
||||
// parse dateString
|
||||
var dateNumbersArray = parseShortDateRegex.exec(dateString);
|
||||
if (dateNumbersArray != null) {
|
||||
var year = Number(dateNumbersArray[parsedYearIndex]);
|
||||
if (parseTwoDigitYear && 0 <= year && year < 100) {
|
||||
// If 2-digit year format and 0 <= year < 100,
|
||||
// parse year as up to 30 years in future or 69 years in past.
|
||||
// (Covers 30-year mortgage and most working people's birthdate.)
|
||||
// otherwise will be treated as four digit year.
|
||||
var currentYear = 1900 + new Date().getYear(); // getYear 0 is 1900.
|
||||
var currentCentury = currentYear - currentYear % 100;
|
||||
year = currentCentury + year;
|
||||
if (year < currentYear - 69)
|
||||
year += 100;
|
||||
if (year > currentYear + 30)
|
||||
year -= 100;
|
||||
}
|
||||
return new Date(year, // four-digit year
|
||||
Number(dateNumbersArray[parsedMonthIndex]) - 1, // 0-based
|
||||
Number(dateNumbersArray[parsedDayIndex]));
|
||||
} else return null; // did not match regex, not a valid date
|
||||
if (dateNumbersArray != null) {
|
||||
var year = Number(dateNumbersArray[this.yearIndex]);
|
||||
if (this.twoDigitYear && 0 <= year && year < 100) {
|
||||
// If 2-digit year format and 0 <= year < 100,
|
||||
// parse year as up to 30 years in future or 69 years in past.
|
||||
// (Covers 30-year mortgage and most working peoples birthdate.)
|
||||
var currentYear = 1900 + new Date().getYear(); // getYear 0 is 1900.
|
||||
var currentCentury = currentYear - currentYear % 100;
|
||||
year = currentCentury + year;
|
||||
if (year < currentYear - 69)
|
||||
year += 100;
|
||||
if (year > currentYear + 30)
|
||||
year -= 100;
|
||||
}
|
||||
var resultDate;
|
||||
var len = dateNumbersArray.length;
|
||||
resultDate = new Date(year, // four-digit year
|
||||
Number(dateNumbersArray[this.monthIndex]) - 1, // 0-based
|
||||
Number(dateNumbersArray[this.dayIndex]));
|
||||
|
||||
// parse last string in dateNumbersArray to get time
|
||||
var timeNumbersArray = parseTimeRegex.exec(dateNumbersArray[4]);
|
||||
if (timeNumbersArray != null) {
|
||||
if ((timeNumbersArray[1]<12) &&
|
||||
((timeNumbersArray[4] == "pm") || (timeNumbersArray[4] == "PM")))
|
||||
//12 hour clock
|
||||
resultDate.setHours(Number(timeNumbersArray[1])+12, timeNumbersArray[2]);
|
||||
else
|
||||
//24 hour clock
|
||||
resultDate.setHours(timeNumbersArray[1], timeNumbersArray[2]);
|
||||
}
|
||||
return resultDate;
|
||||
} else
|
||||
return null; // did not match regex, not a valid date
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
@ -435,36 +435,34 @@ function parseOutlookCSVData( icalStr, discardDuplicates, promptEach )
|
||||
var lineIndex = 1;
|
||||
var totalLines = lines.length-1;
|
||||
var exists = false;
|
||||
|
||||
var formater = new DateFormater();
|
||||
|
||||
while (lineIndex < totalLines) {
|
||||
|
||||
var fields = lines[lineIndex].split('","');
|
||||
fields[0] = fields[0].substring(1); // strip off the leading quote...
|
||||
|
||||
var title = fields[0];
|
||||
var stime = new Date(fields[1] + " " + fields[2]);
|
||||
var etime = new Date(fields[3] + " " + fields[4]);
|
||||
|
||||
exists = entryExists(stime, title);
|
||||
|
||||
calendarEvent = createEvent();
|
||||
calendarEvent.id = createUniqueID( );
|
||||
calendarEvent.title = title;
|
||||
calendarEvent.start.setTime(stime);
|
||||
calendarEvent.end.setTime(etime);
|
||||
|
||||
if ( !exists )
|
||||
eventArray[ eventArray.length ] = calendarEvent;
|
||||
else
|
||||
dupArray[ dupArray.length ] = calendarEvent;
|
||||
|
||||
|
||||
++lineIndex;
|
||||
if (fields.length < 5)
|
||||
continue;
|
||||
|
||||
fields[0] = fields[0].substring(1); // strip off the leading quote...
|
||||
var title = fields[0];
|
||||
//parseShortDate magically decides the format (locale) of dates/times
|
||||
var sdate = formater.parseShortDate(fields[1]+" "+fields[2]);
|
||||
var edate = formater.parseShortDate(fields[3]+" "+fields[4]);
|
||||
if ((sdate != null) && (edate != null)) {
|
||||
exists = entryExists(sdate, title);
|
||||
calendarEvent = createEvent();
|
||||
calendarEvent.id = createUniqueID();
|
||||
calendarEvent.title = title;
|
||||
calendarEvent.start.setTime(sdate);
|
||||
calendarEvent.end.setTime(edate);
|
||||
if ( !exists )
|
||||
eventArray[ eventArray.length ] = calendarEvent;
|
||||
else
|
||||
dupArray[ dupArray.length ] = calendarEvent;
|
||||
}
|
||||
}
|
||||
|
||||
// dump("*** calendar entries : " + eventArray.length + "\n");
|
||||
// dump("*** duplicate entries: " + dupArray.length + "\n");
|
||||
|
||||
return { calendarEventArray: eventArray, calendarDuplicateArray: dupArray };
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user