まず、クライアント マシンは正しいタイム ゾーン オフセット (夏時間かどうかによって -8 時間または -7 時間になる可能性があります) を認識せず、クライアント クロックが正しくない可能性があるため、サーバーでこれを行う必要があります。正確に設定されている (または意図的に誤って設定されている可能性がある)。
そのため、オフセットをクライアントに送信する場合は、時刻だけを送信することもできます。また、ゾーンを送信するときは、PST を送信するだけではなく、実際のオフセット (必要に応じて UTC -8 または -7) を送信してください。または、カットオフ時刻を UTC で送信し、ユーザーに解決してもらいます。
例として、現地時間を別のタイム ゾーンに変換するには、次のようにします。
var pstOffset = 480; // Standard time offset
var pdtOffset = 420 // Daylight saving offset
var now = new Date();
// Adjust to PST
now.setMinutes(now.getMinutes() + now.getTimezoneOffset() - pstOffset);
alert(now); // Time in PST
ただし、実際のオフセットを変更することはできず、時間を調整するだけなので、日付オブジェクトはローカル タイム ゾーンのままであることに注意してください。
カットオフ時刻を送信して現地時間に変換するには、UTC タイムスタンプを送信してローカル ボックスで変換するのが最も簡単な方法です。
var ts = '2012-04-24T08:00:00Z'; // UTC cut-off for standard time on 24/4
var tsd = '2012-04-24T07:00:00Z'; // UTC cut-off for daylight saving time on 24/4
function utcToLocal(s) {
var bits = s.split(/[-T:Z]/g); // Split string into useful bits
var d = new Date();
// Set local date object to UTC supplied time
d.setUTCFullYear(bits[0], bits[1] - 1, bits[2]);
d.setUTCHours(+bits[3], +bits[4], +bits[5]);
return d;
}
alert( 'Your clock says it\'s now ' + (new Date()) +
'\nThe cut-off for shipping is ' + utcToLocal(ts));
そして、サーバー時刻に基づいて適切な UTC タイムスタンプを送信します (たとえば、4 月 24 日の出荷時刻に間に合わなかった場合は、4 月 25 日の時刻を送信します)。
編集
これが完全な解決策ですが、クライアントでこれを行わないでくださいと言ったことを思い出してください。
/* Get the cut-off of 2pm PST or PDT on current or
* next working day. If d is true (e.g. 1) use PDT,
* otherwise use PST
**/
function setCutoffTime(d) {
var pstOffset = 480; // PST offset in minutes
var psdOffset = 420; // PDT offset in minutes
var now = new Date();
var addDays = 0;
var cutoff;
var days = 'Sun Mon Tue Wed Thu Fri Sat Sun'.split(' ');
var months = 'Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec'.split(' ');
// Utility to add a leading zero
function addZ(n) {
return (n<10?'0':'') + n;
}
// Convert to PST time
now.setMinutes(now.getMinutes() +
now.getTimezoneOffset() - (d? psdOffset : pstOffset));
// If after 2pm, push to tomorrow
if (now.getHours() > 14) now.setHours(now.getHours() + 12);
// If on a weekend, push to Monday
if (now.getDay() == 6) addDays = 2;
if (now.getDay() == 0) addDays = 1;
now.setDate(now.getDate() + addDays);
// Now on working day pre 2pm, so set time to 14:00
now.setHours(14, 0, 0);
// And convert back to local time
now.setMinutes(now.getMinutes() - now.getTimezoneOffset() +
(d? psdOffset : pstOffset));
// Return a formatted string - should be a separate function
return 'Shipping cut-off: ' +
addZ(now.getHours()) + ':' +
addZ(now.getMinutes()) + ' on ' +
days[now.getDay()] + ', ' +
now.getDate() + ' ' +
months[now.getMonth()] +
', ' + now.getFullYear();
}
alert(setCutoffTime()); // Cut-off for PST
alert(setCutoffTime(true)); // Cut-off for PDT