/* -*- Mode: Java; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ /* 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 { Services } = ChromeUtils.import("resource://gre/modules/Services.jsm"); 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 Cu.reportError( `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) { Cu.reportError("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) { Cu.reportError("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; }