質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.50%
VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

Q&A

解決済

1回答

1333閲覧

DateInterval.Yearの使い方について

kentasuzuki_

総合スコア28

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

0グッド

0クリップ

投稿2019/05/27 02:08

編集2019/05/27 02:34

前提・実現したいこと

Visual Basicで事務システムを作っています。

DateAdd関数を使ってDateInterval.Yearを使うと、うるう年も考慮されているのですが、
少し面倒な点があります。

例えば、
2023/02/29(A期間)≧2023/02/29(2020/02/29+3年応当日)の条件でエラーメッセージを流したいのですが、
実際にはA期間で2023/02/28と入力をすると、エラーメッセージが流れてしまいます。

本来であれば、2023/02/28と入力をすると、エラーメッセージが流れないようにしたいです。

どのようにコードを書き換えれば解決するのかが分からず質問させていただきました。
宜しくお願い致します。

発生している問題・エラーメッセージ

該当のソースコード

If CDate(AYmd.value)>=CDate(DateAdd(DateInterval.Year, 3, CDate(BYmd.Value))) Then MessageBox.Show("3年以内で入力してください")

試したこと

補足情報(FW/ツールのバージョンなど)

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

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

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

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

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

YAmaGNZ

2019/05/27 02:40

2023/02/29は存在しない日ですが、この場合どうしたいんでしょうか?
kentasuzuki_

2019/05/27 02:53

大変失礼いたしました。 DateIntervalクラスを使うと、うるう年以外の年に関しては、 例えば2020/02/29の3年後は2023/02/29が存在しない日のため、2023/2/28が応当日となるようです。 ですが2023/02/28にエラーメッセージが流れるとプログラムを作る上で困ってしまいます。 つまりうるう年以外の年に関しては2月の月末は-1日引きたいのですが、 そのやり方を教えていただきたいと思っております。
YAmaGNZ

2019/05/27 02:59 編集

すみません。考え違いをしていましたので訂正のためコメントを消させていただきます。
guest

回答1

0

ベストアンサー

希望されている仕様の比較は

BYmdDateAdd(BYmd)の結果AYmd希望結果
2020/02/282023/02/282023/02/28NG
2020/02/292023/02/282023/02/28OK
2020/02/292023/02/282023/03/01NG
2021/02/282024/02/282024/02/28NG
2021/03/012024/03/012024/02/29OK
2021/03/012024/03/012024/03/01NG
2022/02/282025/02/282025/02/28NG
2023/02/282026/02/282026/02/28NG

ということですよね?
ですから、BYmdが2/29の場合は3年後の3/1と比較すれば正常な比較となると思います。
ですので、下記のように素直に判断するしかないのではないかと思います。

VB.NET

1Dim aYmd As String = "2023/02/28" 2Dim bYmd As String = "2020/02/29" 3Dim bDate As Date = Date.Parse(bYmd) 4 5If (bDate.Month = 2) And (bDate.Day = 29) Then 6 bDate = bDate.AddYears(3).AddDays(1) 7Else 8 bDate = bDate.AddYears(3) 9End If 10 11If Date.Parse(aYmd) >= bDate Then 12 Console.WriteLine("3年以内で入力してください") 13End If

投稿2019/05/27 03:39

編集2019/05/27 05:52
YAmaGNZ

総合スコア10222

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

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

kentasuzuki_

2019/05/27 05:40

ご丁寧にありがとうございます。 以下の場合ですが、判断結果はOKではなく、NGになってしまうと思います。 BYmd DateAdd(BYmd)の結果 AYmd 判断結果 2020/02/29 2023/02/28 2023/02/28   OK ↓ BYmd DateAdd(BYmd)の結果 AYmd 判断結果 2020/02/29 2023/02/28 2023/02/28   NG YAmaGNZ様のやり方で試してみたいと思います。 ありがとうございます。
YAmaGNZ

2019/05/27 05:50

言葉足らずでした。 表は希望されている仕様の結果で書いています。 ですので、 2020/02/29 2023/02/28 2023/02/28   OK であっていますよね?
kentasuzuki_

2019/05/27 07:13

2020/02/29 2023/02/28 2023/02/28   OK で合っています。 私も認識不足で申し訳ありません。 ちなみにYAmaGNZ様の方法で試してみたのですが、 Dim bDate As Date = Date.Parse(bYmd) の部分でSystem.FormatExceptionのハンドルされていない例外が mscorlib.dllで発生しました、となってしまったのですが、 追加情報で『文字列は有効なDateTimeとして認識されませんでした。インデックス0から始まる位置に不明な単語があります』と怒られてしまったのですが、 解決方法はご存知でしょうか?
YAmaGNZ

2019/05/27 07:19

私が提示したソースではbYmdをstringとして記載してあります。 質問者さんのソースではBYmd.Valueと何かしらのクラスに格納されているので、そのへんを調整してください。 Dim bDate As Date = CDate(BYmd.Value) としてもらってもかまいません。 AYmdも同様です。
kentasuzuki_

2019/05/27 07:21

そういうことだったのですね。 ご丁寧にありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問