を返す:Calendar.get(Calendar.DAY_OF_MONTH)私は次のコードを実行すると、間違った日
int year = 2017;
int month = 7;
int dayOfMonth = 10;
Calendar dateOfBirth = new GregorianCalendar(year, month, dayOfMonth);
dateOfBirth.getTime(); // See http://bugs.java.com/bugdatabase/view_bug.do?bug_id=4827490
dateOfBirth.setTimeZone(TimeZone.getTimeZone("UTC"));
System.out.println("Original Day Of Month:\t\t" + dayOfMonth);
System.out.println("Calendar:\t\t\t" + dateOfBirth);
System.out.println("Calendar substring:\t\t" + dateOfBirth.toString().substring(dateOfBirth.toString().indexOf("DAY_OF_MONTH"), dateOfBirth.toString().indexOf("DAY_OF_MONTH") + 15));
System.out.println("Formatted date:\t\t\t" + new SimpleDateFormat("dd").format(dateOfBirth.getTime()));
System.out.println("get(Calendar.DAY_OF_MONTH):\t" + dateOfBirth.get(Calendar.DAY_OF_MONTH));
を、私はこの出力を得る:
Original Day Of Month: 10
Calendar: java.util.GregorianCalendar[time=1502312400000,areFieldsSet=false,areAllFieldsSet=false,lenient=true,zone=sun.util.calendar.ZoneInfo[id="UTC",offset=0,dstSavings=0,useDaylight=false,transitions=0,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=?,YEAR=2017,MONTH=7,WEEK_OF_YEAR=?,WEEK_OF_MONTH=?,DAY_OF_MONTH=10,DAY_OF_YEAR=?,DAY_OF_WEEK=?,DAY_OF_WEEK_IN_MONTH=?,AM_PM=0,HOUR=0,HOUR_OF_DAY=0,MINUTE=0,SECOND=0,MILLISECOND=?,ZONE_OFFSET=?,DST_OFFSET=?]
Calendar substring: DAY_OF_MONTH=10
Formatted date: 10
get(Calendar.DAY_OF_MONTH): 9
あなたが見ることができるように、値がdateOfBirth.get(Calendar.DAY_OF_MONTH)
で返されます間違っています。
生年月日であるため、私はUTCを使用しています。特定のタイムゾーンに依存しないようにしたいと思います。それを正しく行うために、私はdateOfBirth.getTime()
に電話をする必要があります - http://bugs.java.com/bugdatabase/view_bug.do?bug_id=4827490を参照してください。 私はその電話を取る場合、これは正しく動作しますが、私は他のバグに遭遇します。
月の正しい日を正確に取得するために何ができるのですか?
私はJava v1.7.0_79を使用しています。重要な場合は、現在GMT + 3です。
10日目に9日を出力したいので、0日目は単に1日目を意味すると思います。日付出力をdd-MM-yyyyにフォーマットすると、カレンダーのjavadocには、月がインデックス0で始まるので、10-08-2017 最後に、数字が1で始まり0でない人間の慣習に戻るためには、1を加えなければならないことを覚えておいてください。 – Webster
@Websterインデックス0から始まっていません。それは1から始まります。 –
あなたはJava 7を使用していて、まさに今すぐJava 8にアップグレードするつもりはないと思います。それでも、あなたのプログラムが日付やタイムゾーンの作業をしているなら、[ThreeTen Backport](http://www.threeten.org/threetenbp/)を入手して最新のクラスを使い始めることを真剣に検討してください。 'LocalDate'では日付が何であるかを知っています。また、一般的に、現代のクラスは、このような多くの驚きを伴って動作するように非常に良いです。そして最終的にはあなたのJavaバージョンをアップグレードすれば、これらのクラスはJava 8以降に組み込まれているので、あなたは準備が整っています。 –