日付を含めず、時刻のみの比較を行いたいです。
例えば、以下のような時間のデータがあった時
const start_time = new Date("2000-01-02T07:00:00.000+09:00"); // Sun Jan 02 2000 07:00:00 GMT+0900 (日本標準時) const end_time = new Date("2000-01-01T22:00:00.000+09:00"); // Sat Jan 01 2000 22:00:00 GMT+0900 (日本標準時) const now = new Date(); // Tue Jul 03 2018 08:11:25 GMT+0900 (日本標準時)
now
が、start_time
とend_time
に含まれるかを調べたいとします。
その際に、普通に<
などで調べると、日付がstart_time
やend_time
は2000年代なので、必ずnow
のほうが大きくなってしまいます。
こういった際に、日付を無視して比較する方法はないのでしょうか?
今考えている方法は、一回start_time
とend_time
の時刻のみを取り出して、新規にnow
と同じ日付で時間を作り直し、それを比較するという煩雑なやり方で、どうも無駄が多いように感じましたのでご質問させていただきました。
よろしくお願いします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

回答7件
0
ベストアンサー
案1:
getHours()
して比較、等しければgetMinutes()
して比較、等しければ・・・以下同様
案2:
getHours()*3600+getMinutes()*60+getSeconds()+getMilliseconds()/1000.0
を比較
案3:
""+
して文字列にして、時刻の所だけ切り出して文字列として比較
投稿2018/07/03 01:11
総合スコア86293
0
startがendよりあとになっているのは運用上あまり得策とはいえません
通常startの時間7時からendの時間22時までの間と解釈すべきですが
時間が逆転しているので論理的には22時から7時の間と判断すべきです
そのアタリのロジックがはっきりしないと正しい判断をしづらいと思います
考え方としては
endがstartより前の場合はstartとendを逆転して判断する
その上で、start、endの日付をnowに寄せてから処理するか
時間を文字列として抜き出して処理するのどちらかが有効でしょう
もちろんstartとendの時間が同じだった場合24時間とみるのか0時間とみるのか
など細かい仕様をつめていかなといけません。
投稿2018/07/03 00:21
総合スコア117673
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

0
getHours()などで比較すればいいのでは
投稿2018/07/03 01:11
編集2018/07/03 01:14総合スコア246
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/07/03 01:34

0
一回start_timeとend_timeの時刻のみを取り出して、新規にnowと同じ日付で時間を作り直し、それを比較する
それで良いと思いますよ。
Dateオブジェクトによる明確な比較はdatetime型にする必要がありますし。
年月日だけの比較に見えて、時間が00:00:00が入っていますし。
まあ、時分秒だけ個別に取り出して時分秒を結合してparseInt()した上で比較する方法もないわけではないですが・・。
12:34:56 → 123456
09:01:08 → 90108
投稿2018/07/03 00:11
総合スコア80888
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
いろいろと考えられると思いますが、ミリ秒で計算すれば一日の開始時刻を設定できたりするのでいいかなと思います。
JavaScript
1function getMillisecondsOfLocalDay(dt, offsetHours = 0) { 2 return (dt.getTime() - (offsetHours * 60 + dt.getTimezoneOffset()) * 60000) % 86400000; 3} 4 5const start_time = getMillisecondsOfLocalDay(new Date("2000-01-02T07:00:00.000+09:00"), 3); // 14400000 = (7 - 3) * 60 * 60 * 1000 6const end_time = getMillisecondsOfLocalDay(new Date("2000-01-01T22:00:00.000+09:00"), 3); // 68400000 = (22 - 3) * 60 * 60 * 1000 7 8const now = getMillisecondsOfLocalDay(new Date("2018-07-04T02:00:00.000+09:00"), 3); // 82800000 = (26 - 3) * 60 * 60 * 1000
投稿2018/07/03 01:43
総合スコア13749
0
getHours および getMinutes を使う場合で処理を書いてみました。
深夜営業の場合も含めると、少しごちゃつくかなぁといった感じです。
const start_hour = start_time.getHours() const start_min = start_time.getMinutes() const end_hour = end_time.getHours() const end_min = end_time.getMinutes() const now_hour = now.getHours() const now_min = now.getMinutes() const status = (() => { if (now_hour === start_hour) { return start_min <= now_min ? ("営業中") : ("営業時間外"); } else if (now_hour === end_hour) { return now_min < end_min ? ("営業中") : ("営業時間外"); } else if (end_hour > 9) { // 深夜営業でない場合 return start_hour < now_hour && now_hour < end_hour ? ("営業中") : ("営業時間外"); } else { // 深夜営業の場合 return start_hour < now_hour || now_hour < end_hour ? ("営業中") : ("営業時間外"); // now_hourは必ず24以下なので } })();
とりあえずこれで完了とし、機を改めてより別の方法も考えてみようと思います。
皆様ご回答ありがとうございました。
投稿2018/07/03 07:49
総合スコア86
0
toTimeString() を使って文字列に変換して比較する、ってのも使えそうです。
JavaScript
1js>start_time = new Date('2000-01-02T07:00:00+09:00'); 2Sun Jan 02 2000 07:00:00 GMT+0900 (JST) 3js>end_time = new Date('2000-01-01T22:00:00+09:00'); 4Sat Jan 01 2000 22:00:00 GMT+0900 (JST) 5js>now = new Date(); 6Tue Jul 03 2018 10:24:49 GMT+0900 (JST) 7js>writeln(start_time.toTimeString()); 807:00:00 GMT+0900 (JST) 9js>writeln(end_time.toTimeString()); 1022:00:00 GMT+0900 (JST) 11js>writeln(now.toTimeString()); 1210:24:49 GMT+0900 (JST) 13js>
投稿2018/07/03 01:27
総合スコア13707
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/07/03 07:50