Closed Bug 322230 Opened 14 years ago Closed 14 years ago

need an xpcom service to format a datetime


(Calendar :: Internal Components, defect)

Not set


(Not tracked)



(Reporter: mvl, Assigned: mvl)




(1 file, 1 obsolete file)

There is code to format a datetime in dateUtils.js, but that can't be called from xpcom components (like the exporters). We should convert the code into a proper xpcom service.
Attached patch patch v1 (obsolete) — Splinter Review
Ported the code. Didn't convert any callers yet.
Attachment #207427 - Flags: first-review?(dmose)
Comment on attachment 207427 [details] [diff] [review]
patch v1

In general, this looks good.  Most of my review comments here are nits.

The boilerplate for this IDL claims that it's Oracle Corporation code.  I bet it's not.  :-)

>+[scriptable, uuid(17101743-f016-4fb2-90dd-0c043aa44579)]
>+interface calIDateTimeFormatter : nsISupports

There are a number of methods in this interface where the doxygen comments don't match the method name (mostly short vs long).

formatDateTime looks like it wants some doxygen love.

>+    // XXX using wstring instead of AString, because AString as outparam
>+    //     seems to fail in javascript.
>+    void formatInterval(in calIDateTime aStartDate,
>+                        in calIDateTime aEndDate,
>+                        out wstring aStartString,
>+                        out wstring aEndString);

If that commentary is true, that sounds like a pretty serious regression.  Shaver claims this shouldn't be happening.  Can you come up with an isolated test case?

>Index: base/src/calDateTimeFormatter.js
>RCS file: base/src/calDateTimeFormatter.js
>diff -N base/src/calDateTimeFormatter.js
>--- /dev/null	1 Jan 1970 00:00:00 -0000
>+++ base/src/calDateTimeFormatter.js	3 Jan 2006 18:23:42 -0000
>+ * The Original Code is Oracle Corporation code.
>+ *
>+ * The Initial Developer of the Original Code is
>+ *  Michiel van Leeuwen <>
>+ * Portions created by the Initial Developer are Copyright (C) 2006
>+ * the Initial Developer. All Rights Reserved.

I think the boilerplate for this file probably needs to be inherited from the original pre-ported code and then have your name appended to it.

>+    // If LONG FORMATTED DATE is same as short formatted date,
>+    // then OS has poor extended/long date config, so use workaround.
>+    this.mUseLongDateService = true;
>+    var probeDate = 
>+        Components.classes[";1"]
>+                  .createInstance(Components.interfaces.calIDateTime);
>+    probeDate.jsDate = new Date(2002,3-1,4);

Why |3-1| here?

>+calDateTimeFormatter.prototype.formatDate =
>+function formatDate(aDate) {
>+    // Format the date using user's format preference (long or short)
>+    var format;
>+    var prefBranch = Components.classes[";1"]
>+                                .getService(Components.interfaces.nsIPrefBranch);
>+    try {     
>+        format = prefBranch.getIntPref("");
>+    } catch(e) {
>+        format = 0;
>+    }
>+    if (format == 0)
>+        return this.formatDateLong(aDate);
>+    else
>+        return this.formatDateShort(aDate);

FWIW, i'd vote for this being "long" or "short" for pref file readability, if there aren't already clients out there that depend on the existing syntax.

>+calDateTimeFormatter.prototype.formatDateWithoutYear =
>+function formatDateWithoutYear(aDate) {
>+    // Format the date using a hardcoded format for now, since everything
>+    // that displays the date uses this function we will be able to 
>+    // make a user settable date format and use it here.
>+    return this.shortMonthName(aDate.month) + " " +;

I don't understand what the above comment means.

>+calDateTimeFormatter.prototype.formatDateTime =
>+function formatDateTime(aDate) {
>+    var formattedDate = this.formatDate(aDate);
>+    var formattedTime = this.formatTime(aDate);
>+    var timeBeforeDate;
>+    var prefBranch = Components.classes[";1"]
>+                                .getService(Components.interfaces.nsIPrefBranch);
>+    try {     
>+        timeBeforeDate = prefBranch.getBoolPref("");
>+    } catch(e) {
>+        timeBeforeDate = 0;
>+    }

Time before date isn't a piece of information that we can somehow extract from the locale?

>+calDateTimeFormatter.prototype.formatInterval =
>+function formatInterval(aStartDate, aEndDate, aStartString, aEndString) {

If you could give each clause in this method a bit of commentary, it would make for easier reading/reviewing.
Attachment #207427 - Flags: first-review?(dmose) → first-review-
Attached patch patch v2Splinter Review
Updated the patch to the review comments, except for changing the pref, because that pref is already in use, and i don't want to write a pref migrator just for this. Also didn't remove the formatTimeBeforeDate pref, because it isn't really a locale thing, but a user pref thing (and it was like that in the old code...)
Attachment #207427 - Attachment is obsolete: true
Attachment #207651 - Flags: first-review?(dmose)
Comment on attachment 207651 [details] [diff] [review]
patch v2

>+calDateTimeFormatter.prototype.formatInterval =
>+function formatInterval(aStartDate, aEndDate, aStartString, aEndString) {
>+    endDate = aEndDate.clone();
>+    if (aStartDate.isDate) { 
>+ -= 1;
>+        endDate.normalize();
>+    }

I assume this is because end-date is exclusive rather than inclusive.  Can you add a comment to that effect?

Otherwise, looks great.  r=dmose.
Attachment #207651 - Flags: first-review?(dmose) → first-review+
patch checked in. Actually using this is bug 322768
Closed: 14 years ago
Resolution: --- → FIXED
*** Bug 320662 has been marked as a duplicate of this bug. ***
You need to log in before you can comment on or make changes to this bug.