diff --git a/cms/static/js/views/settings/main_settings_view.js b/cms/static/js/views/settings/main_settings_view.js index 84244c6e7b..3d5861ca25 100644 --- a/cms/static/js/views/settings/main_settings_view.js +++ b/cms/static/js/views/settings/main_settings_view.js @@ -33,8 +33,7 @@ CMS.Views.Settings.Details = CMS.Views.ValidatingView.extend({ $(this).show(); }); - var dateIntrospect = new Date(); - this.$el.find('#timezone').html("(" + dateIntrospect.getTimezone() + ")"); + this.$el.find('#timezone').html("(" + tzAbbr() + ")"); this.listenTo(this.model, 'invalid', this.handleValidationError); this.listenTo(this.model, 'change', this.showNotificationBar); diff --git a/cms/templates/settings.html b/cms/templates/settings.html index a8dc48dd18..eff9176956 100644 --- a/cms/templates/settings.html +++ b/cms/templates/settings.html @@ -14,7 +14,7 @@ from contentstore import utils - + diff --git a/common/static/js/vendor/tzAbbr.js b/common/static/js/vendor/tzAbbr.js new file mode 100644 index 0000000000..18eb5947ee --- /dev/null +++ b/common/static/js/vendor/tzAbbr.js @@ -0,0 +1,59 @@ +/* Friendly timezone abbreviations in client-side JavaScript + +`tzAbbr()` or `tzAbbr(new Date(79,5,24))` +=> "EDT", "CST", "GMT", etc.! + +There's no 100% reliable way to get friendly timezone names in all +browsers using JS alone, but this tiny function scours a +stringified date as best it can and returns `null` in the few cases +where no friendly timezone name is found (so far, just Opera). + +Device tested & works in: +* IE 6, 7, 8, and 9 (latest versions of all) +* Firefox 3 [through] 16 (16 = latest version to date) +* Chrome 22 (latest version to date) +* Safari 6 (latest version to date) +* Mobile Safari on iOS 5 & 6 +* Android 4.0.3 stock browser +* Android 2.3.7 stock browser +* IE Mobile 9 (WP 7.5) + +Known to fail in: +* Opera 12 (desktop, latest version to date) + +For Opera, I've included (but commented out) a workaround spotted +on StackOverflow that returns a GMT offset when no abbreviation is +found. I haven't found a decent workaround. + +If you find any other cases where this method returns null or dodgy +results, please say so in the comments; even if we can't find a +workaround it'll at least help others determine if this approach is +suitable for their project! +*/ +var tzAbbr = function (dateInput) { + var dateObject = dateInput || new Date(), + dateString = dateObject + "", + tzAbbr = ( + // Works for the majority of modern browsers + dateString.match(/\(([^\)]+)\)$/) || + // IE outputs date strings in a different format: + dateString.match(/([A-Z]+) [\d]{4}$/) + ); + + if (tzAbbr) { + // Old Firefox uses the long timezone name (e.g., "Central + // Daylight Time" instead of "CDT") + tzAbbr = tzAbbr[1].match(/[A-Z]/g).join(""); + } + + // Uncomment these lines to return a GMT offset for browsers + // that don't include the user's zone abbreviation (e.g., + // "GMT-0500".) I prefer to have `null` in this case, but + // you may not! + // First seen on: http://stackoverflow.com/a/12496442 + // if (!tzAbbr && /(GMT\W*\d{4})/.test(dateString)) { + // return RegExp.$1; + // } + + return tzAbbr; +}; \ No newline at end of file