ユーザーのローカルの時間ではなくサーバーの時間を取得して、その時間に応じて処理を行ってみます。
※2017/09/22
IEでAjaxのキャッシュが残ってしまうようなので、cache: false を追加しました。
サンプルコード
まずはサーバーの時間を取得してみます。
JavaScript
$(function() {
$.ajax({
type: 'GET',
cache: false
}).done(function(data, status, xhr) {
try {
// サーバーの時間を取得
var date = new Date(xhr.getResponseHeader('Date'));
} catch(e) {
// 取得できなかった場合はローカルの時間を取得
var date = new Date();
}
console.log(date);
}).fail(function() {
// 取得できなかった場合はローカルの時間を取得
var date = new Date();
console.log(date);
});
});
consoleに現在のサーバーの時間を表示しました。
もし失敗している場合、ローカルの時間を表示するようにしています。
サーバーの時間を取得するデモページ
次にあらかじめ決めておいた日時の範囲内に、現在日時が入っている場合に処理を行うようにしてみます。
HTML
<div id="result"></div>
JavaScript
// YYYY-MM-DD-HH-MM-SS
var dateRangeArr = [
{
'start': '2017-09-01-00-00-00',
'end': '2017-09-08-00-00-00'
}, {
'start': '2017-09-08-00-00',
'end': '2017-08-15-00-00'
}, {
'start': '2017-09-15',
'end': '2017-09-22'
}, {
'start': '2017-9-22',
'end': '2017-9-29'
}, {
'start': '2017-9-29',
'end': '2017-10-06'
}
];
$(function() {
$.ajax({
type: 'GET',
cache: false
}).done(function(data, status, xhr) {
try {
// サーバーの時間を取得
var date = new Date(xhr.getResponseHeader('Date'));
} catch(e) {
// 取得できなかった場合はローカルの時間を取得
var date = new Date();
}
callback_func(date);
}).fail(function() {
// 取得できなかった場合はローカルの時間を取得
var date = new Date();
callback_func(date);
});
// サーバーの時間を取得した後に行う処理
function callback_func(currentDate) {
// 結果に出力する内容
var insText = '';
for (var i = 0; i < dateRangeArr.length; i++) {
// 開始日時
var st = format_date(dateRangeArr[i]['start']);
var startDate = new Date(st[0], st[1], st[2], st[3], st[4], st[5]);
// 終了日時
var en = format_date(dateRangeArr[i]['end']);
var endDate = new Date(en[0], en[1], en[2], en[3], en[4], en[5]);
var result = current_time_range_contains(currentDate, startDate, endDate);
if(result) {
insText += (i + 1) + '番目の配列の範囲に入っています。<br>';
}
}
$('#result').html(insText);
}
// 現在時刻が指定範囲内かどうかを調べる
function current_time_range_contains(currentDate, startDate, endDate) {
var currentTimestamp = currentDate.getTime();
var startTimestamp = startDate.getTime();
var endTimestamp = endDate.getTime();
if(startTimestamp <= currentTimestamp && currentTimestamp <= endTimestamp) {
return true;
} else {
return false;
}
}
// ハイフン区切りの日付を整形
function format_date(date) {
var dateArr = date.split('-');
// 2桁の数値で先頭が0の場合は除去する
for (var i = 0; i < dateArr.length; i++) {
dateArr[i] = Number(dateArr[i]);
}
// 月は-1しておく
if(dateArr.length >= 2) {
dateArr[1] = dateArr[1] - 1;
}
// 足りていない値の補足
while(dateArr.length < 6) {
// 日が足りていない場合は1、それ以外は0を追加する
if(dateArr.length === 2) {
dateArr[dateArr.length] = 1;
} else {
dateArr[dateArr.length] = 0;
}
}
return dateArr;
}
});
指定範囲内に入っている場合、テキストを表示するようにしました。
サーバーの時間が指定範囲内の場合に処理をするデモページ
先ほどのサンプルを少し変更して、今日が誕生日かどうかを調べるようにしてみます。
JavaScript
// 誕生日のデータ
var dateRangeArr = [
{'name': '七咲 逢', 'birthday': '2-21'},
~ 略 ~
{'name': 'エイスリン・ウィッシュアート', 'birthday': '7-25'}
]
$(function() {
$.ajax({
type: 'GET',
cache: false
}).done(function(data, status, xhr) {
try {
// サーバーの時間を取得
var date = new Date(xhr.getResponseHeader('Date'));
} catch(e) {
// 取得できなかった場合はローカルの時間を取得
var date = new Date();
}
callback_func(date);
}).fail(function() {
// 取得できなかった場合はローカルの時間を取得
var date = new Date();
callback_func(date);
});
// サーバーの時間を取得した後に行う処理
function callback_func(currentDate) {
// 結果に出力する内容
var insText = currentDate.getMonth() + '月' + currentDate.getDate() + '日の誕生日<br>';
for (var i = 0; i < dateRangeArr.length; i++) {
// 誕生日の範囲
var bd = format_date(currentDate.getFullYear() + '-' + dateRangeArr[i]['birthday']);
var birthdayStart = new Date(bd[0], bd[1], bd[2], bd[3], bd[4], bd[5]);
var birthdayEnd = new Date(bd[0], bd[1], bd[2], bd[3], bd[4], bd[5]);
birthdayEnd.setDate(birthdayEnd.getDate() + 1);
// 今日が誕生日かどうかを調べる
var result = current_time_range_contains(currentDate, birthdayStart, birthdayEnd);
if(result) {
insText += dateRangeArr[i]['name'] + ',';
}
}
$('#result').html(insText);
}
// 現在時刻が指定範囲内かどうかを調べる
function current_time_range_contains(currentDate, startDate, endDate) {
var currentTimestamp = currentDate.getTime();
var startTimestamp = startDate.getTime();
var endTimestamp = endDate.getTime();
if(startTimestamp <= currentTimestamp && currentTimestamp <= endTimestamp) {
return true;
} else {
return false;
}
}
// ハイフン区切りの日付を整形
function format_date(date) {
var dateArr = date.split('-');
// 2桁の数値で先頭が0の場合は除去する
for (var i = 0; i < dateArr.length; i++) {
dateArr[i] = Number(dateArr[i]);
}
// 月は-1しておく
if(dateArr.length >= 2) {
dateArr[1] = dateArr[1] - 1;
}
// 足りていない値の補足
while(dateArr.length < 6) {
// 日が足りていない場合は1、それ以外は0を追加する
if(dateArr.length === 2) {
dateArr[dateArr.length] = 1;
} else {
dateArr[dateArr.length] = 0;
}
}
return dateArr;
}
});
【参考サイト】
コメントが承認されるまで時間がかかります。