Sono combattuto: da un lato cerco di non rispondere a chi fa cross-browsing, dall'altro ho recentemente avuto a che fare con un problema identico al tuo, e ho risolto (come mia perversa abitudine) con un prototipo JavaScript per gestire l'intera classe di problemi, anziché il problema specifico.
codice:
var f = new SimpleDateFormat("EEEE d MMMM yyyy 'ore' HH:ss");
document.getElementById('orologio').innerHTML = f.format(new Date());
Facile no?

Butta questo codice in una libreria JS da caricare in esterno e il gioco è fatto:
codice:
/**
 * java.text.SimpleDateFormat
 * Si usa allo stesso identico modo di:
 * http://java.sun.com/j2se/1.4.1/docs/...ateFormat.html
 */

var LOCALIZED_MONTHS = new Array(
  "Gennaio", "Febbraio", "Marzo", "Aprile",
  "Maggio", "Giugno", "Luglio", "Agosto",
  "Settembre", "Ottobre", "Novembre", "Dicembre"
);

var LOCALIZED_DAYS = new Array(
  "Domenica", "Lunedì",
  "Martedì", "Mercoledì",
  "Giovedì", "Venerdì", "Sabato"
);

String.prototype.nf = function(c)
{
  return this.length < c ? ("0" + this).nf(c) : this;
}

String.prototype.isBrokenApart = function()
{
  if (this.length < 2)
    return (this.length < 1 || this < 'A' || this > 'z');
  return false;
}

Array.prototype.ss = function(i, exp, func)
{
  var it = this[i].split(exp);
  if (it.length < 2)
    return this[i].isBrokenApart();
  eval("this.splice(i, 1, '" + it.join("',func,'") + "')");
  return this[i].isBrokenApart();
}

function _yyy(d) {return d.getFullYear()};
function _yy(d) {return ("" + d.getFullYear()).substring(2)};
function _y(d) {return d.getFullYear()};
function _MMMM(d) {return LOCALIZED_MONTHS[d.getMonth()]};
function _MMM(d) {return LOCALIZED_MONTHS[d.getMonth()].substring(0, 3)};
function _MM(d) {return ("" + (d.getMonth() + 1)).nf(2)};
function _M(d) {return d.getMonth() + 1};
function _dd(d) {return ("" + d.getDate()).nf(2)};
function _d(d) {return d.getDate()};
function _EEEE(d) {return LOCALIZED_DAYS[d.getDay()]};
function _EEE(d) {return LOCALIZED_DAYS[d.getDay()].substring(0, 3)};
function _EE(d) {return ("" + d.getDay()).nf(2)};
function _E(d) {return d.getDay()};
function _HH(d) {return ("" + d.getHours()).nf(2)};
function _H(d) {return d.getHours()};
function _mm(d) {return ("" + d.getMinutes()).nf(2)};
function _m(d) {return d.getMinutes()};
function _ss(d) {return ("" + d.getSeconds()).nf(2)};
function _s(d) {return d.getSeconds()};
function _SSS(d) {return ("" + d.getMilliseconds()).nf(3)};
function _SS(d) {return ("" + d.getMilliseconds()).nf(2)};
function _S(d) {return d.getMilliseconds()};
function _a(d) {return d.getHours() < 12 ? "AM" : "PM"};
function _KK(d) {return d.getHours() <= 12 ? d.getHours() : ("" + (d.getHours() - 12)).nf(2)};
function _K(d) {return d.getHours() <= 12 ? d.getHours() : d.getHours() - 12};

function SimpleDateFormat(pattern)
{
  var ps = (" " + pattern + " ").split("'");
  if (ps.length % 2 == 0) return;
  for (var i = 1; i < ps.length - 1; i++)
  {
    if (ps[i] == "")
    {
      ps[i-1] += "'" + ps[i+1];
      ps.splice(i--, 2);
    }
  }

  for (var i = 0; i < ps.length; i+=2)
    if
    (
      ps[i].isBrokenApart()
      || ps.ss(i, /y{3,}/, _yyy)
      || ps.ss(i, "yy", _yy)
      || ps.ss(i, "y", _y)
      || ps.ss(i, /M{4,}/, _MMMM)
      || ps.ss(i, "MMM", _MMM)
      || ps.ss(i, "MM", _MM)
      || ps.ss(i, "M", _M)
      || ps.ss(i, /d{2,}/, _dd)
      || ps.ss(i, "d", _d)
      || ps.ss(i, /E{4,}/, _EEEE)
      || ps.ss(i, "EEE", _EEE)
      || ps.ss(i, "EE", _EE)
      || ps.ss(i, "E", _E)
      || ps.ss(i, /H{2,}/, _HH)
      || ps.ss(i, "H", _H)
      || ps.ss(i, /m{2,}/, _mm)
      || ps.ss(i, "m", _m)
      || ps.ss(i, /s{2,}/, _ss)
      || ps.ss(i, "s", _s)
      || ps.ss(i, /S{3,}/, _SSS)
      || ps.ss(i, "SS", _SS)
      || ps.ss(i, "S", _S)
      || ps.ss(i, /a+/, _a)
      || ps.ss(i, /K{2,}/, _KK)
      || ps.ss(i, "K", _K)
    )
    continue;
  
  ps[0] = ps[0].substring(1);
  pl = ps.length - 1;
  ps[pl] = ps[pl].substring(0, ps[pl].length - 1);
  this.ps = ps;
}

SimpleDateFormat.prototype.format = function(d)
{
  var r = "";
  for (var i = 0; i < this.ps.length; i++)
    if (typeof this.ps[i] == "function")
      r += this.ps[i](d);
    else
      r += this.ps[i];
  return r;
}