$(document).ready(function() { function clkNow() { return (window.TKLMClock && window.TKLMClock.now) ? window.TKLMClock.now() : new Date(); } var weekMap = {Sun:0, Mon:1, Tue:2, Wed:3, Thu:4, Fri:5, Sat:6}; var week = [ '星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六', ]; var ianaEl = document.getElementById('countryiana'); var iana = ianaEl ? (ianaEl.innerHTML || '').trim() : ''; var timeEl = document.getElementById('countrytime'); var fallbackOffset = timeEl ? (parseFloat(timeEl.innerHTML) || 0) : 0; var fmt = null; if (iana && iana !== '0' && typeof Intl !== 'undefined' && Intl.DateTimeFormat) { try { fmt = new Intl.DateTimeFormat('en-US', { timeZone: iana, hour12: false, year: 'numeric', month: '2-digit', day: '2-digit', hour: '2-digit', minute: '2-digit', second: '2-digit', weekday: 'short' }); fmt.format(clkNow()); } catch (e) { fmt = null; } } function readParts(now) { if (fmt) { var p = {}; var parts = fmt.formatToParts(now); for (var i = 0; i < parts.length; i++) { if (parts[i].type !== 'literal') p[parts[i].type] = parts[i].value; } var h = parseInt(p.hour, 10); if (h === 24) h = 0; var w = weekMap[p.weekday]; return { Y: parseInt(p.year, 10), M: parseInt(p.month, 10), D: parseInt(p.day, 10), h: h, m: parseInt(p.minute, 10), s: parseInt(p.second, 10), w: (w === undefined ? 0 : w) }; } var t = new Date(now.getTime() + fallbackOffset * 3600000); return { Y: t.getUTCFullYear(), M: t.getUTCMonth() + 1, D: t.getUTCDate(), h: t.getUTCHours(), m: t.getUTCMinutes(), s: t.getUTCSeconds(), w: t.getUTCDay() }; } function IfZero(num) { return ((num <= 9) ? ("0" + num) : num); } function check24(hour) { return (hour >= 24) ? hour - 24 : hour; } function tzOffsetHours(zone, when) { try { var f = new Intl.DateTimeFormat('en-US', { timeZone: zone, hour12: false, year: 'numeric', month: '2-digit', day: '2-digit', hour: '2-digit', minute: '2-digit', second: '2-digit' }); var p = {}; var arr = f.formatToParts(when); for (var i = 0; i < arr.length; i++) { if (arr[i].type !== 'literal') { p[arr[i].type] = arr[i].value; } } var asUTC = Date.UTC(+p.year, (+p.month) - 1, +p.day, (+p.hour) % 24, +p.minute, +p.second); return (asUTC - when.getTime()) / 3600000; } catch (e) { return null; } } function fmtDiff(h) { var sign = h > 0 ? '早+' : (h < 0 ? '晚' : ''); var a = Math.abs(h); var hh = Math.floor(a); var mm = Math.round((a - hh) * 60); if (mm === 60) { hh += 1; mm = 0; } var tail = (mm === 0) ? (hh + ':00') : (hh + ':' + (mm < 10 ? '0' + mm : mm)); if (h === 0) { return '一致'; } return sign + (h < 0 ? '-' : '') + tail + '小时'; } function syncDiff() { var el = document.getElementById('realtime_diff'); if (!el || !iana || typeof Intl === 'undefined') { return; } var now = clkNow(); var local = tzOffsetHours(iana, now); var bj = tzOffsetHours('Asia/Shanghai', now); if (local === null || bj === null) { return; } var txt = fmtDiff(local - bj); if (txt === '相同' || txt === '没有时差' || txt === '无时差' || txt === '与北京时间一致') { txt = '一致'; } if (txt) { el.textContent = txt; } try { var hostEl = el.parentNode; if (hostEl) { var fullTxt = hostEl.textContent || ''; var selfCmp = '北京时间比北京时间:'; if (fullTxt.indexOf(selfCmp) >= 0) { var LP2 = String.fromCharCode(40); var RP2 = String.fromCharCode(41); hostEl.textContent = fullTxt.replace(selfCmp + txt, '北京时间即中国标准时间' + LP2 + 'CST' + RP2 + ',全国统一使用'); } } } catch (e) {} } function zoneName(h) { if (Math.abs(h) < 0.001) { return '零时区'; } var CN = ['零','一','二','三','四','五','六','七','八','九']; var sign = h > 0 ? '东' : '西'; var a = Math.abs(h); var hh = Math.floor(a); var mm = Math.round((a - hh) * 60); if (mm === 60) { hh += 1; mm = 0; } var tail = (mm === 0) ? '区' : ((mm === 30) ? '半区' : ((mm === 45) ? '三刻区' : '区')); var num; if (hh < 10) { num = CN[hh]; } else if (hh === 10) { num = '十'; } else { num = '十' + CN[hh - 10]; } return sign + num + tail; } function fmtOff(h) { var sg = h >= 0 ? '+' : '-'; var a = Math.abs(h); return sg + a.toFixed(2); } function syncOffset() { if (!iana || typeof Intl === 'undefined') { return; } var now = clkNow(); var local = tzOffsetHours(iana, now); if (local === null) { return; } var txtOff = fmtOff(local); var txtZone = zoneName(local); var i, els; els = document.getElementsByClassName('rt-offset'); for (i = 0; i < els.length; i++) { els[i].textContent = txtOff; } els = document.getElementsByClassName('rt-zone'); for (i = 0; i < els.length; i++) { els[i].textContent = txtZone; } var LPAREN = String.fromCharCode(40); var RPAREN = String.fromCharCode(41); els = document.getElementsByClassName('rt-zone-full'); for (i = 0; i < els.length; i++) { els[i].textContent = LPAREN + txtZone + RPAREN; } } function setTime(sel, txt, iso) { var el = $(sel); if (el.length === 0) { return; } el.text(txt); if (iso) { el.attr('datetime', iso); } } function isoOf(p, offH) { var sg = offH >= 0 ? '+' : '-'; var a = Math.abs(offH); var hh = Math.floor(a); var mm = Math.round((a - hh) * 60); if (mm === 60) { hh += 1; mm = 0; } return p.Y + '-' + IfZero(p.M) + '-' + IfZero(p.D) + 'T' + IfZero(p.h) + ':' + IfZero(p.m) + ':' + IfZero(p.s) + sg + IfZero(hh) + ':' + IfZero(mm); } function tick() { var now = clkNow(); var utc = now.getTime(); var g = new Date(utc); var b = new Date(utc + 8 * 3600000); var l = readParts(now); var off = (iana && typeof Intl !== 'undefined') ? tzOffsetHours(iana, now) : fallbackOffset; if (off === null) { off = fallbackOffset; } $('#getgmt').text('当前世界时间(GMT):' + g.getUTCFullYear() + '-' + (g.getUTCMonth() + 1) + '-' + g.getUTCDate() + ' ' + IfZero(g.getUTCHours()) + ':' + IfZero(g.getUTCMinutes()) + ':' + IfZero(g.getUTCSeconds()) + ''); $('#getbj').text('当前北京时间:' + b.getUTCFullYear() + '-' + (b.getUTCMonth() + 1) + '-' + b.getUTCDate() + ' ' + IfZero(check24(b.getUTCHours())) + ':' + IfZero(b.getUTCMinutes()) + ':' + IfZero(b.getUTCSeconds()) + ''); setTime('#localtime', IfZero(check24(l.h)) + ':' + IfZero(l.m) + ':' + IfZero(l.s), isoOf(l, off)); setTime('#gettime_gmt', IfZero(g.getUTCHours()) + ':' + IfZero(g.getUTCMinutes()) + ':' + IfZero(g.getUTCSeconds()), isoOf(l, 0)); setTime('#localdate', l.Y + '年' + IfZero(l.M) + '月' + IfZero(l.D) + '日 ' + week[l.w], isoOf(l, off)); } tick(); syncDiff(); syncOffset(); setInterval(tick, 1000); setInterval(syncDiff, 60000); setInterval(syncOffset, 60000); if (window.TKLMClock && window.TKLMClock.onSync) { window.TKLMClock.onSync(function () { tick(); syncDiff(); syncOffset(); }); } });