iOSで年月日を操作するコツ
iOSで今月の1日や前月末日を求めたいことが頻繁にある。
iOSで年月日を操作するには次の3つを押さえる必要がある。
これについては、どのプラットフォームでもどの言語でも同様だ。
・カレント・カレンダー
通常はグレゴリオ暦を使う。
・システム・タイムゾーン
日本時間やグリニッジ標準時などそのプラットフォームで設定されているタイムゾーンを使う。
コンピュータがもつ時計(グリニッジ標準時をベースとして1970年1月1日からの秒数)を各国の時差を勘案して年月日表示するために使うものだ。
日本時間を指定した場合は、グリニッジ標準時よりちょうど9時間早い時間を表示する。
・NSDateComponents
iOSの場合には、NSDate そのものではなく別クラスの NSDateComponents を介して年月日の操作を行う。
-
1)カレント・カレンダーを指定すること
年月日を操作するには、NSCalendarクラスを指定する必要がある。
NSCalendar *calendar = [NSCalendar currentCalendar];
2)NSDateComponentsクラスを使用すること
日付を操作したりNSDateから年月日を抽出したりするには、NSDateComponents クラスを使う。
NSDate *date = [NSDate date];
NSDateComponents *dateComponents = [calendar components:NSCalendarUnitYear |
NSCalendarUnitMonth |
NSCalendarUnitDay
fromDate:date];
3)タイムゾーン(NSTimeZone)はシステム・タイムゾーン(iPhone設定のタイムゾーン)を指定すること
[dateComponents setTimeZone:[NSTimeZone systemTimeZone]];
4)1ヶ月前の NSDate を求める方法
NSDateComponents#setMonth をマイナス1することで前月を表す。
\* 年末年始にまたがる(年が変わる)場合も対応している。
NSDate *date = [NSDate date];
NSDateComponents *dateComponents = [calendar components:NSCalendarUnitYear |
NSCalendarUnitMonth |
NSCalendarUnitDay
fromDate:date];
[dateComponents setYear:dateComponents.year];
[dateComponents setMonth:dateComponents.month - 1];
[dateComponents setDay:dateComponents.day];
NSDate *aMonthAgo = [calendar dateFromComponents:dateComponents];
5)前月の1日の NSDate を求める方法
4で1ヶ月前の NSDate を求めた後に NSDateComponents#setDay に1を指定する
NSDateComponents *dateComponents = [calendar components:NSCalendarUnitYear |
NSCalendarUnitMonth |
NSCalendarUnitDay
fromDate:aMonthAgo];
[dateComponents setYear:dateComponents.year];
[dateComponents setMonth:dateComponents.month];
[dateComponents setDay:1];
NSDate *aMonthAgo = [calendar dateFromComponents:dateComponents];
6)前月の月末の NSDate を求める方法
// 当月の1日の NSDate を求める
NSDate *date = [NSDate date];
NSDateComponents *dateComponents = [calendar components:NSCalendarUnitYear |
NSCalendarUnitMonth |
NSCalendarUnitDay
fromDate:date];
[dateComponents setYear:dateComponents.year];
[dateComponents setMonth:dateComponents.month];
[dateComponents setDay:1];
NSDate *firstDayOnThisMonth = [calendar dateFromComponents:dateComponents];
// 当月1日の前日=前月の末日 の NSDate を求める
NSDateComponents *dateComponents = [calendar components:NSCalendarUnitYear |
NSCalendarUnitMonth |
NSCalendarUnitDay
fromDate:firstDayOnThisMonth];
[dateComponents setYear:dateComponents.year];
[dateComponents setMonth:dateComponents.month];
[dateComponents setDay:-1];
NSDate *lastDayOnLastMonth = [calendar dateFromComponents:dateComponents];
2023年8月 | ||||||
日 | 月 | 火 | 水 | 木 | 金 | 土 |
  |   | 1 | 2 | 3 | 4 | 5 |
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |   |   |
iOS
web
アプリの著作権
ブロックチェーン/暗号技術
新しい社会
禅・大乗仏教
日本のなりたち