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

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

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

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

Q&A

解決済

1回答

630閲覧

【Kotlin】Calendarの計算が合わない

nnnnn

総合スコア26

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

0グッド

0クリップ

投稿2018/07/13 18:29

前提・実現したいこと

Android StudioでKotlinを使ってアプリを制作しております。

Calendarを使用して
日付の計算をしていたところ、
2018年3月30日の次の日が
2018年4月1日になってしまいます。

3月30日の次の日なので、3月31日になると思うのですが、
どうして4月1日になってしまうのかわからず、困っております。

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

Calendarに、2018年3月29日を設定。
1日後を計算すると、
2018年3月30日と表示される。

次に、Calendarに、2018年3月30日を設定。
1日後を計算すると、
2018年4月1日と表示されてしまう。

また、Calendarに、2018年3月31日を設定。
1日後を計算すると、
2018年4月2日と表示されてしまう。

Kotlin

1 var myCalendar01 = Calendar.getInstance(TimeZone.getDefault(), Locale.getDefault()) 2 if (myCalendar01 != null) { 3 4 myCalendar01.clear() 5 myCalendar01.set(2018, 3, 29) 6 myCalendar01.add(Calendar.DATE, 1) 7 Log.i("date1", myCalendar01.get(Calendar.YEAR).toString() + "年" + myCalendar01.get(Calendar.MONTH).toString() + "月" + myCalendar01.get(Calendar.DATE).toString() + "日") 8 9 myCalendar01.clear() 10 myCalendar01.set(2018, 3, 30) 11 myCalendar01.add(Calendar.DATE, 1) 12 Log.i("date2", myCalendar01.get(Calendar.YEAR).toString() + "年" + myCalendar01.get(Calendar.MONTH).toString() + "月" + myCalendar01.get(Calendar.DATE).toString() + "日") 13 14 myCalendar01.clear() 15 myCalendar01.set(2018, 3, 31) 16 myCalendar01.add(Calendar.DATE, 1) 17 Log.i("date3", myCalendar01.get(Calendar.YEAR).toString() + "年" + myCalendar01.get(Calendar.MONTH).toString() + "月" + myCalendar01.get(Calendar.DATE).toString() + "日") 18 }

<表示されるLog>
I/date1: 2018年3月30日
I/date2: 2018年4月1日
I/date3: 2018年4月2日

試したこと

myCalendar01.isLenient = trueをfalseにしたり、
myCalendar01.clear()を追加または削除したり、
TimeZoneを"Asia/Tokyo", LocaleをJAPANにする等してみたのですが、
変化はありませんでした。

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

MacOS High Sierraにて制作
Android Studio 3.0.1
1.2.51-release-Studio3.1-1 of the Kotlin pluginを使用

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

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

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

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

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

guest

回答1

0

ベストアンサー

Kotlinはあまり使ったことがないですが、ソースコードを見て怪しいなと思った点を、
JavaScript/Java/C言語の日付ライブラリは、月の数字は0から始まります(0オリジン)。
KotlinJavaベースだと思っているので、↓は3月29日ではなく4月29日を設定していませんか?

Java

1myCalendar01.set(2018, 3, 29)

◇参考情報
0. javaでCalendarクラスから取得した月の値が1月分ずれてしまう
0. 月のオリジン

投稿2018/07/13 19:24

編集2018/07/13 20:43
umyu

総合スコア5846

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

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

nnnnn

2018/07/14 13:13 編集

その通りでした、その点、忘れていました…。 確認したところ、1月ずらして計算してみると計算が合いました。 素早い回答、ありがとうございました、 助かりました! ```Kotlin var myCalendar01 = Calendar.getInstance(TimeZone.getDefault(), Locale.getDefault()) if (myCalendar01 != null) { //2018年1月27日(実際は2018年2月27日) myCalendar01.clear() myCalendar01.set(2018, 1, 27) myCalendar01.add(Calendar.DATE, 1) Log.i("2018年2月27日の1日後", myCalendar01.get(Calendar.YEAR).toString() + "年" + (myCalendar01.get(Calendar.MONTH).plus(1)).toString() + "月" + myCalendar01.get(Calendar.DATE).toString() + "日") //2018年1月28日(実際は2018年2月28日) myCalendar01.clear() myCalendar01.set(2018, 1, 28) myCalendar01.add(Calendar.DATE, 1) Log.i("2018年2月28日の1日後", myCalendar01.get(Calendar.YEAR).toString() + "年" + (myCalendar01.get(Calendar.MONTH).plus(1)).toString() + "月" + myCalendar01.get(Calendar.DATE).toString() + "日") //2018年2月29日(実際は2018年3月29日) myCalendar01.clear() myCalendar01.set(2018, 2, 29) myCalendar01.add(Calendar.DATE, 1) Log.i("2018年3月29日の1日後", myCalendar01.get(Calendar.YEAR).toString() + "年" + (myCalendar01.get(Calendar.MONTH).plus(1)).toString() + "月" + myCalendar01.get(Calendar.DATE).toString() + "日") //2018年2月30日(実際は2018年3月30日) myCalendar01.clear() myCalendar01.set(2018, 2, 30) myCalendar01.add(Calendar.DATE, 1) Log.i("2018年3月30日の1日後", myCalendar01.get(Calendar.YEAR).toString() + "年" + (myCalendar01.get(Calendar.MONTH).plus(1)).toString() + "月" + myCalendar01.get(Calendar.DATE).toString() + "日") //2018年2月31日(実際は2018年3月31日) myCalendar01.clear() myCalendar01.set(2018, 2, 31) myCalendar01.add(Calendar.DATE, 1) Log.i("2018年3月31日の1日後", myCalendar01.get(Calendar.YEAR).toString() + "年" + (myCalendar01.get(Calendar.MONTH).plus(1)).toString() + "月" + myCalendar01.get(Calendar.DATE).toString() + "日") //2018年3月29日(実際は2018年4月29日) myCalendar01.clear() myCalendar01.set(2018, 3, 29) myCalendar01.add(Calendar.DATE, 1) Log.i("2018年4月29日の1日後", myCalendar01.get(Calendar.YEAR).toString() + "年" + (myCalendar01.get(Calendar.MONTH).plus(1)).toString() + "月" + myCalendar01.get(Calendar.DATE).toString() + "日") //2018年3月30日(実際は2018年4月30日) myCalendar01.clear() myCalendar01.set(2018, 3, 30) myCalendar01.add(Calendar.DATE, 1) Log.i("2018年4月30日の1日後", myCalendar01.get(Calendar.YEAR).toString() + "年" + (myCalendar01.get(Calendar.MONTH).plus(1)).toString() + "月" + myCalendar01.get(Calendar.DATE).toString() + "日") //2018年3月31日(実際は2018年4月31日) myCalendar01.clear() myCalendar01.set(2018, 3, 31) myCalendar01.add(Calendar.DATE, 1) Log.i("2018年4月31日の1日後", myCalendar01.get(Calendar.YEAR).toString() + "年" + (myCalendar01.get(Calendar.MONTH).plus(1)).toString() + "月" + myCalendar01.get(Calendar.DATE).toString() + "日") } ``` <表示されるLog> I/2018年2月27日の1日後: 2018年2月28日 I/2018年2月28日の1日後: 2018年3月1日 I/2018年3月29日の1日後: 2018年3月30日 I/2018年3月30日の1日後: 2018年3月31日 I/2018年3月31日の1日後: 2018年4月1日 I/2018年4月29日の1日後: 2018年4月30日 I/2018年4月30日の1日後: 2018年5月1日 I/2018年4月31日の1日後: 2018年5月2日 ```Kotlin var myCalendar02 = Calendar.getInstance(TimeZone.getDefault(), Locale.getDefault()) if (myCalendar02 != null) { //2018年2月30日(実際は2018年3月30日) myCalendar02.clear() myCalendar02.set(2018, 3 - 1, 30) myCalendar02.add(Calendar.DATE, 1) Log.i("変更後:2018年3月30日の1日後", myCalendar02.get(Calendar.YEAR).toString() + "年" + myCalendar02.get(Calendar.MONTH).toString() + "月" + myCalendar02.get(Calendar.DATE).toString() + "日") } ``` I/変更後:2018年3月30日の1日後: 2018年4月1日
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問