diff options
Diffstat (limited to '')
-rw-r--r-- | comm/mailnews/base/content/dateFormat.js | 227 |
1 files changed, 227 insertions, 0 deletions
diff --git a/comm/mailnews/base/content/dateFormat.js b/comm/mailnews/base/content/dateFormat.js new file mode 100644 index 0000000000..600aa873fa --- /dev/null +++ b/comm/mailnews/base/content/dateFormat.js @@ -0,0 +1,227 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/* Utilities to show and parse user-entered date values used in filter and search rules. */ + +"use strict"; + +const formatYMD = 1; +const formatYDM = 2; +const formatMDY = 3; +const formatMYD = 4; +const formatDMY = 5; +const formatDYM = 6; +const formatMIN = 1; +const formatMAX = 6; + +var gSearchDateFormat = 0; +var gSearchDateSeparator; +var gSearchDateLeadingZeros; + +/** + * Get the short date format option of the current locale. + * This supports the common case which the date separator is + * either '/', '-', '.' and using Christian year. + */ +function initLocaleShortDateFormat() { + try { + const dateFormatter = new Services.intl.DateTimeFormat(undefined, { + dateStyle: "short", + }); + var aDate = new Date(1999, 11, 2); + // Short formats can be space-separated, like 02 Dec 1999. + var dateString = dateFormatter + .format(aDate) + .replace(" 2", "2") + .replace(/ /g, "/"); + + // find out the separator + var possibleSeparators = "/-."; + var arrayOfStrings; + for (let i = 0; i < possibleSeparators.length; ++i) { + arrayOfStrings = dateString.split(possibleSeparators[i]); + if (arrayOfStrings.length == 3) { + gSearchDateSeparator = possibleSeparators[i]; + break; + } + } + + // check the format option + if (arrayOfStrings.length != 3) { + // no successful split + console.error( + `initLocaleShortDateFormat: could not analyze date format of ${dateString}, defaulting to yyyy/mm/dd` + ); + } else { + // The date will contain a zero if the system settings include leading zeros. + gSearchDateLeadingZeros = dateString.includes("0"); + + // Match 2 as number, since that will match both "2" and "02". + // Let's not look for 12 since it could be Dec instead. + if (arrayOfStrings[0] == 2) { + // 02.12.1999 or 02.1999.12 + gSearchDateFormat = arrayOfStrings[1] == "1999" ? formatDYM : formatDMY; + } else if (arrayOfStrings[1] == 2) { + // 12.02.1999 or 1999.02.12 + gSearchDateFormat = arrayOfStrings[0] == "1999" ? formatYDM : formatMDY; + } else { + // implies arrayOfStrings[2] == 2 + // 12.1999.02 or 1999.12.02 + gSearchDateFormat = arrayOfStrings[0] == "1999" ? formatYMD : formatMYD; + } + } + } catch (e) { + console.error("initLocaleShortDateFormat: caught an exception: " + e); + gSearchDateFormat = 0; + } +} + +function initializeSearchDateFormat() { + if (gSearchDateFormat > 0) { + return; + } + + // get a search date format option and a separator + try { + gSearchDateFormat = Services.prefs.getComplexValue( + "mailnews.search_date_format", + Ci.nsIPrefLocalizedString + ).data; + + gSearchDateFormat = parseInt(gSearchDateFormat); + + // if the option is 0 then try to use the format of the current locale + if (gSearchDateFormat == 0) { + initLocaleShortDateFormat(); + } else { + // initialize the search date format based on preferences + if (gSearchDateFormat < formatMIN || gSearchDateFormat > formatMAX) { + gSearchDateFormat = formatYMD; + } + + gSearchDateSeparator = Services.prefs.getComplexValue( + "mailnews.search_date_separator", + Ci.nsIPrefLocalizedString + ).data; + + gSearchDateLeadingZeros = + Services.prefs.getComplexValue( + "mailnews.search_date_leading_zeros", + Ci.nsIPrefLocalizedString + ).data == "true"; + } + } catch (e) { + console.error("initializeSearchDateFormat: caught an exception: " + e); + gSearchDateFormat = 0; + } + + if (gSearchDateFormat == 0) { + // Set to yyyy/mm/dd in case we couldn't determine in any way. + gSearchDateFormat = formatYMD; + gSearchDateSeparator = "/"; + gSearchDateLeadingZeros = true; + } +} + +function convertPRTimeToString(tm) { + var time = new Date(); + // PRTime is in microseconds, JavaScript time is in milliseconds + // so divide by 1000 when converting + time.setTime(tm / 1000); + + return convertDateToString(time); +} + +function convertDateToString(time) { + initializeSearchDateFormat(); + + var year = time.getFullYear(); + var month = time.getMonth() + 1; // since js month is 0-11 + if (gSearchDateLeadingZeros && month < 10) { + month = "0" + month; + } + var date = time.getDate(); // day + if (gSearchDateLeadingZeros && date < 10) { + date = "0" + date; + } + + var dateStr; + var sep = gSearchDateSeparator; + + switch (gSearchDateFormat) { + case formatYMD: + dateStr = year + sep + month + sep + date; + break; + case formatYDM: + dateStr = year + sep + date + sep + month; + break; + case formatMDY: + dateStr = month + sep + date + sep + year; + break; + case formatMYD: + dateStr = month + sep + year + sep + date; + break; + case formatDMY: + dateStr = date + sep + month + sep + year; + break; + case formatDYM: + dateStr = date + sep + year + sep + month; + break; + default: + dump("valid search date format option is 1-6\n"); + } + + return dateStr; +} + +function convertStringToPRTime(str) { + initializeSearchDateFormat(); + + var arrayOfStrings = str.split(gSearchDateSeparator); + var year, month, date; + + // set year, month, date based on the format option + switch (gSearchDateFormat) { + case formatYMD: + year = arrayOfStrings[0]; + month = arrayOfStrings[1]; + date = arrayOfStrings[2]; + break; + case formatYDM: + year = arrayOfStrings[0]; + month = arrayOfStrings[2]; + date = arrayOfStrings[1]; + break; + case formatMDY: + year = arrayOfStrings[2]; + month = arrayOfStrings[0]; + date = arrayOfStrings[1]; + break; + case formatMYD: + year = arrayOfStrings[1]; + month = arrayOfStrings[0]; + date = arrayOfStrings[2]; + break; + case formatDMY: + year = arrayOfStrings[2]; + month = arrayOfStrings[1]; + date = arrayOfStrings[0]; + break; + case formatDYM: + year = arrayOfStrings[1]; + month = arrayOfStrings[2]; + date = arrayOfStrings[0]; + break; + default: + dump("valid search date format option is 1-6\n"); + } + + month -= 1; // since js month is 0-11 + + var time = new Date(year, month, date); + + // JavaScript time is in milliseconds, PRTime is in microseconds + // so multiply by 1000 when converting + return time.getTime() * 1000; +} |