(It is too much trouble to do this for only one timezone.)
This returns the strings for US timezones with current dst rules.
You'll need the dst start and end rules for any zone you add
Date.toTZString= function(d, tzp){
var short_months= ['Jan', 'Feb', 'Mar', 'Apr', 'May',
'Jun', 'Jul','Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
var h, m, pm= 'pm', off, label, str,
d= d? new Date(d):new Date();
var tz={
AK:['Alaska', -540],
A:['Atlantic', -240],
C:['Central', -360],
E:['Eastern', -300],
HA:['Hawaii-Aleutian', -600],
M:['Mountain', -420],
N:['Newfoundland', -210],
P:['Pacific', -480]
}[tzp.toUpperCase()];
//get the selected offset from the object:
if(!tz) return d.toUTCString();
off= tz[1];
//get the start and end dates for dst:(these rules are US only)
var y= d.getUTCFullYear(), countstart= 8, countend= 1,
dstart= new Date(Date.UTC(y, 2, 8, 2, 0, 0, 0)),
dend= new Date(Date.UTC(y, 10, 1, 2, 0, 0, 0));
while(dstart.getUTCDay()!== 0) dstart.setUTCDate(++countstart);
while(dend.getUTCDay()!== 0) dend.setUTCDate(++countend);
//get the GMT time for the localized dst start and end times:
dstart.setUTCMinutes(off);
dend.setUTCMinutes(off);
// if the date passed in is between dst start and dst end, adjust the offset and label:
if(dstart<= d && dend>= d){
off+= 60;
label= tzp+'dt';
}
else label= tzp+'st';
//add the adjusted offset to the date and get the hours and minutes:
d.setUTCMinutes(d.getUTCMinutes()+off);
h= d.getUTCHours();
m= d.getUTCMinutes();
if(h> 12) h-= 12;
else if(h!== 12) pm= 'am';
if(h== 0) h= 12;
if(m<10) m= '0'+m;
//return a string:
var str= short_months[d.getUTCMonth()]+' '+d.getUTCDate()+', ';
return str+ h+':'+m+' '+pm+' '+label.toUpperCase();
}
//test1:
var d= new Date().toUTCString();
[d, Date.toTZString(d, 'E'), Date.toTZString(d, 'P')].join('\n');
Mon, 12 Mar 2012 17:46:30 GMT
Mar 12, 1:46 pm EDT
Mar 12, 10:46 am PDT
//test2:
var d=new Date(1352134800000).toUTCString();
[d,Date.toTZString(d, 'E'),Date.toTZString(d, 'P')].join('\n');
Mon, 05 Nov 2012 17:00:00 GMT
Nov 5, 12:00 pm EST
Nov 5, 9:00 am PST