Skip to content

Instantly share code, notes, and snippets.

@seanupton
Created August 30, 2012 21:54
Show Gist options
  • Save seanupton/3542243 to your computer and use it in GitHub Desktop.
Save seanupton/3542243 to your computer and use it in GitHub Desktop.
Proposed local time normalization in JavaScript for plone.app.event event view.
_pad2 = function (v) { return (v < 10) ? ('0' + v) : ('' + v); }
utc_offset = function (dt) {
var tzoffset = 'Z', offset=dt.getTimezoneOffset();
if (offset != 0) {
tzoffset = (offset < 0) ? '+' : '-';
offset = Math.abs(offset);
tzoffset += _pad2(Math.floor(offset/60)) + ':' + _pad2(offset%60);
}
return tzoffset;
}
dt_parse = function (stamp) {
var dt;
var dt = new Date(stamp);
if (dt == NaN) {
/** https://github.com/csnover/js-iso8601 */(function(n,f){var u=n.parse,c=[1,4,5,6,7,10,11];n.parse=function(t){var i,o,a=0;if(o=/^(\d{4}|[+\-]\d{6})(?:-(\d{2})(?:-(\d{2}))?)?(?:T(\d{2}):(\d{2})(?::(\d{2})(?:\.(\d{3}))?)?(?:(Z)|([+\-])(\d{2})(?::(\d{2}))?)?)?$/.exec(t)){for(var v=0,r;r=c[v];++v)o[r]=+o[r]||0;o[2]=(+o[2]||1)-1,o[3]=+o[3]||1,o[8]!=="Z"&&o[9]!==f&&(a=o[10]*60+o[11],o[9]==="+"&&(a=0-a)),i=n.UTC(o[1],o[2],o[3],o[4],o[5]+a,o[6],o[7])}else i=u?u(t):NaN;return i}})(Date)
dt = new Date(Date.parse(stamp));
}
return dt;
}
offsetstring = function (dt) {
var offset = utc_offset(dt);
if (offset == 'Z') return ' (UTC)';
return ' (UTC'+offset+')';
}
timestring = function (dt, ampm) {
var hour = dt.getHours(),
m = dt.getMinutes();
if (!ampm) return ''+_pad2(hour)+':'+_pad2(m); // 24h
ampm = (hour >= 12) ? ' PM' : ' AM'; // get am/pm label
hour = (hour > 12) ? hour-12 : hour; // recalc pm times
hour = (hour==0) ? 12 : hour; // midnight hour
return '' + _pad2(hour) + ':' + _pad2(m) + ampm; // 12h am/pm
}
is_ampm = function (timelabel) {
var p = new RegExp('[AP][.]?M[.]?', 'i');
return Boolean(p.exec(timelabel));
}
show_local_date = function () {
var details = jq('.eventDetails'),
initial = jq('.vevent', details).first(),
timerange = jq('.timerange'),
dtstart = jq('.dtstart', timerange).attr('title'),
dtend = jq('.dtend', timerange).attr('title'),
start = dt_parse(dtstart),
end = dt_parse(dtend),
ampm = is_ampm(jq('.dtstart', timerange).text()),
msg;
if ((start != NaN) && (end != NaN)) {
jq('.dtstart', timerange).empty().text(timestring(start, ampm));
jq('.dtend', timerange).empty().text(timestring(end, ampm));
msg = jq('<em>Times displayed are adjusted to your local time. '+offsetstring(start)+'</em>');
jq('span.timezone', initial).empty().append(msg);
}
}
show_local_date();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment