🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

4回答

1382閲覧

[JavaScript] Date型の比較について

joyboy

総合スコア35

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2020/11/23 17:02

編集2020/11/24 11:02

お世話になっております。
プログラマー駆け出しJavaScriptを独学で学習中の者です。

下記のようなプログラムを行い、Date型の比較をした際に一部不可解な結果が出力されてしまいます。

JavaScript

1var date1 = new Date("2020-11-25"); 2var date2 = new Date("2020-11-24"); 3 4//date1がdate2以上の場合エラー出力 5if (date1 >= date2 ) { 6 alert("日付入力エラー"); 7};

日付がdate1とdate2共に月の単位が2桁の場合は、想定通りの動きをするのですが、月の単位が1桁の場合、エラーをキャッチするif文に該当しないようで素通りしてしまいます。
両方の月、もしくはどちらかの月が1桁の場合でもエラーは出力されませんでした。

[2020.11.24 - 追記]

■エラーを出力する条件
date1がdate2以上の日付である場合、エラーを知らせるアラートを出力

■エラーが出力される日付パターン
date1 = new Date("2020-11-25" + "T00:00:00")
date2 = new Date("2020-11-24" + "T00:00:00")

//Console.log出力値
date1 = Wed Nov 25 2020 00:00:00 GMT+0900 (日本標準時)
date2 = Tue Nov 24 2020 00:00:00 GMT+0900 (日本標準時)

■エラーが出力されない日付パターン
date1 = new Date("2020-9-25" + "T00:00:00")
date2 = new Date("2020-9-24" + "T00:00:00")

//Console.log出力値
date1 = Invalid Date
date2 = Invalid Date

追記をしていて気付いたのですが、月が一桁の時日付がエラーが出力されていないのは、変数が日付として認識していないのが問題のようです。
※恥ずかしながらConsole.logの使い方をつい先程知りました。
日付として認識されないのはなぜでしょうyか?
有識者の皆様アドバイスをお願いいたします。

■動作環境
・Windows10
・XAMPP Ver7.4.1(最新)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

otn

2020/11/23 17:42 編集

「このプログラムを実行すると、こういう結果を予想したが、実際はこういう結果だった」 という風に質問文を書き直してください。
m.ts10806

2020/11/23 20:14

せめて試したパターンケース並べてconsole.log()で一通り出力してみるくらいまではやってみてほしい。
maisumakun

2020/11/23 22:22 編集

想定したように動作しない入力パターンを示していただけませんでしょうか?
joyboy

2020/11/24 10:56

皆様ご指摘ありがとうございます。 質問内容を追記しましたので、ご確認お願い致します。
guest

回答4

0

最初は書いてなかったT00:00:00がありますね。それが原因です。

plain

12020-9-25 ・・・正しい慣用表記 22020-9-25 00:00:00 ・・・正しい慣用表記 3 42020-09-25T00:00:00 ・・・正しいISO8601表記 52020-9-25T00:00:00 ・・・不正なISO8601表記

投稿2020/11/24 11:11

otn

総合スコア85893

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

joyboy

2020/11/24 11:35

回答ありがとうございます。 ご指摘の通り正しい慣用表記で修正したところ正常に動作しました! ありがとうございます。 質問内容に記載し忘れた箇所があり申し訳ありませんでした。 今後注意いたします。
guest

0

new Date(文字列)に投げられる文字列の形式は、ブラウザによります

多くのブラウザで対応しているのがISO 8601と呼ばれる形式ですが、これは2020-01-01のように、1桁の月日には0が必須です。

2020-1-1のように違う形式で書いた場合、ブラウザによって「処理の可否」あるいは「結果」がどうなるか、変わりえます。

投稿2020/11/24 11:13

maisumakun

総合スコア145975

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

joyboy

2020/11/24 11:44

回答ありがとうございます。 >投げられる文字列の形式は、ブラウザによります。 知りませんでした。普段chromeで検証していますが、どのブラウザでも正常に動作するよう運用面を考慮して形式を意識していきます。 アドバイスありがとうございます!
guest

0

ISO 8601 拡張形式

new DateISO 8601 拡張形式をサポートしますが、月(MM)と日(DD)は2桁と文法が決まっています。

ECMAScript defines a string interchange format for date-times based upon a simplification of the ISO 8601 calendar date extended format. The format is as follows: YYYY-MM-DDTHH:mm:ss.sssZ

それ以外のフォーマットを指定して、実装依存性を持たせるぐらいなら、素直にISO 8601 拡張形式を使うのがベターです。

ちなみに、タイムゾーン識別子を省略すると、UTC日時として扱われますので、日本日時か必要ならタイムゾーン識別子を指定しましょう。

JavaScript

1new Date('2020-01-01T00:00:00.000+0900');

new Date(year, month, day)

new Date で第三引数まで指定すると、ブラウザのロケールに対応したタイムゾーン識別子を持つ日時として扱われます。

JavaScript

1new Date(2020, 0, 1);

上記コードは日本のロケールで実行すれば、「日本時間の2020/01/01 00:00」であり、米国のロケールで実行すれば、「米国時間の2020/01/01 00:00」になります。

期待する動作によって、ISO 8601 拡張形式と使い分ける必要があります。

  • ロケールに応じた相対日時
  • 絶対日時

Re: joyboy さん

投稿2020/11/24 11:27

編集2020/11/24 11:29
think49

総合スコア18189

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

joyboy

2020/11/24 11:55

回答ありがとうございます。 >ISO 8601 拡張形式をサポートしますが、月(MM)と日(DD)は2桁と文法が決まっています。 他の方からもご指摘があり調べてみようと思っていたところ、詳しく解説いただきありがとうございます。 とても分かりやすいです。 今回は日付の比較のみでしたが、今後時間など詳しい比較する時に使い慣れておこうと素人の浅知恵で余計なことをしてしまったのが原因でした。 アドバイスいただきありがとうございます!
guest

0

ベストアンサー

月の単位が1桁

ちょっと意味がわかりません。普通に動きませんか?

javascript

1var date1 = new Date("2020-10-1"); 2var date2 = new Date("2020-9-30"); 3console.log(date1>=date2); //true

投稿2020/11/24 00:09

yambejp

総合スコア116694

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

joyboy

2020/11/24 10:59

yambejp さん 回答いただきありがとうございます。 > 普通に動きませんか? という事はやり方自体は間違ってないようなので、原因は別にありそうですね。 質問内容を追記しましたので、ご確認いただけますでしょうか。
yambejp

2020/11/24 11:22

>new Date("2020-9-25" + "T00:00:00") そんな質問に書いてないことを後出しするのはまずいです・・・・ 日付と時間を「T」でつなぐ場合はフォーマットが決まっているので 月や日は2桁必須です。 Tではなくスペースで繋げば行けるはずです d1 = new Date("2020-9-24 00:00:00") d2 = new Date("2020-10-1 00:00:00") d3 = new Date("2020-9-24T00:00:00") d4 = new Date("2020-10-1T00:00:00") console.log([d1,d2,d3,d4]);
joyboy

2020/11/24 11:31

>月や日は2桁必須 そういう事でしたか!ご指摘の通り修正したところ正常に動作しました。 ありがとうございます。 最初の質問内容と追記情報に差異があり申し訳ありませんでした。 今後注意いたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問