指定した日時からの経過時間を取得する「DCDate」クラス改訂版

UIDatePickerの取得や年号日付時刻等の情報を取得する「DCDate」クラスに、指定した日時からの経過時間を「日・時・分・秒」単位で取得する機能を追加しました。

例えば「RSSフィードから取得した更新日時が7日以内であれば更新アイコンを表示する」等の用途に使用できると思います。

下記よりファイルのダウンロードが行えます。

ダウンロード

主な機能

  1. UIDatePickerの取得
  2. UIDatePickerの選択時刻と現在時刻の比較
  3. UIDatePickerで選択した日付と現在の日付の比較
  4. UIDatePickerで選択中の年号/月日/時分の取得
  5. 現在の年号/月日/時分秒の取得
  6. 指定した日時からの経過時間を取得

使用方法

指定した日時からの経過日数を取得

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// 日付フォーマット定義
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc]init];
[dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];

// 基点となる日付(2014年1月1日)と目標の日付(今日)を定義
NSString *referenceDateString = @"2014-01-01 00:00:00";
NSString *targetDateString    = [dateFormatter stringFromDate:[NSDate date]];

// 2014年1月1日から今日までの経過日数を CGFloat型で取得
CGFloat since = [DCDate since:referenceDateString targetDateString:targetDateString
                   dateFormat:@"yyyy-MM-dd HH:mm:ss" dateUnit:3];

// 小数点を切り捨て NSNumber型に変換
NSNumber *sinceNum = @(floorf(since));

// コンソール出力
NSLog(@"今日は 2014年1月1日から [email protected]", sinceNum);

UIDatePickerの取得

1
2
3
4
UIDatePicker *datePicker = [DCDate picker:self rect:CGRectMake(0, self.view.frame.size.height - 210, 320, 210)
                        mode:UIDatePickerModeDateAndTime minuteInterval:1
                    dateText:@"2013-09-09 15:00:00" dateFormat:@"yyyy-MM-dd HH:mm:ss"
                      action:@selector(pickerChanged:)];

現在の日付とピッカーの日付を比較

1
BOOL isCurrentDate = [DCDate isCurrentDate];

現在時刻とピッカーの時刻を比較

1
BOOL isCurrentTime = [DCDate isCurrentTime];

UIDatePickerで選択中の年号/月日/時分の取得

1
2
3
4
5
NSInteger pickerYear = [DCDate pickerYear];
NSInteger pickerMonth = [DCDate pickerMonth];
NSInteger pickerDay = [DCDate pickerDay];
NSInteger pickerHour = [DCDate pickerHour];
NSInteger pickerMinute = [DCDate pickerMinute];

現在の年号/月日/時分秒の取得

1
2
3
4
5
6
NSInteger currentYear = [DCDate currentYear];
NSInteger currentMonth = [DCDate currentMonth];
NSInteger currentDay = [DCDate currentDay];
NSInteger currentHour = [DCDate currentHour];
NSInteger currentMinute = [DCDate currentMinute];
NSInteger currentSecond = [DCDate currentSecond];

ソースコード

DCDate.h

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
#import <Foundation/Foundation.h>

@interface DCDate : NSObject

#pragma mark - public method
+ (UIDatePicker *)picker:(id)delegate rect:(CGRect)rect mode:(UIDatePickerMode)mode minuteInterval:(NSUInteger)minuteInterval dateText:(NSString *)dateText dateFormat:(NSString *)dateFormat action:(SEL)action;
+ (NSDate *)date:(NSString *)dateText dateFormat:(NSString *)dateFormat;
+ (NSString *)dateText:(NSString *)dateFormat;
+ (NSInteger)pickerYear;
+ (NSInteger)pickerMonth;
+ (NSInteger)pickerDay;
+ (NSInteger)pickerHour;
+ (NSInteger)pickerMinute;
+ (NSInteger)currentYear;
+ (NSInteger)currentMonth;
+ (NSInteger)currentDay;
+ (NSInteger)currentHour;
+ (NSInteger)currentMinute;
+ (NSInteger)currentSecond;
+ (NSDateComponents *)currentDateComponents;
+ (BOOL)isCurrentDate;
+ (BOOL)isCurrentTime;
+ (CGFloat)since:(NSString *)referenceDateString targetDateString:(NSString *)targetDateString dateFormat:(NSString *)dateFormat dateUnit:(NSUInteger)dateUnit;

@end

DCDate.m

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
#import "DCDate.h"

@implementation DCDate

static UIDatePicker *datePicker;

#pragma mark - Date Picker

// ピッカー取得
+ (UIDatePicker *)picker:(id)delegate rect:(CGRect)rect mode:(UIDatePickerMode)mode minuteInterval:(NSUInteger)minuteInterval dateText:(NSString *)dateText dateFormat:(NSString *)dateFormat action:(SEL)action
{
    // ピッカー初期化
    DCDate.datePicker = [[UIDatePicker alloc] initWithFrame:rect];

    // 背景色指定
    DCDate.datePicker.backgroundColor = [UIColor whiteColor];

    // 日付の表示モードを変更する
    DCDate.datePicker.datePickerMode = mode;

    // 何分刻みにするか
    DCDate.datePicker.minuteInterval = minuteInterval;

    // 初期時刻設定
    [DCDate.datePicker setDate:[DCDate date:dateText dateFormat:dateFormat]];

    // ピッカーの値が変更されたときに呼ばれるメソッドを設定
    [DCDate.datePicker addTarget:delegate action:action forControlEvents:UIControlEventValueChanged];

    return DCDate.datePicker;
}

// ピッカーに表示する時間取得
+ (NSDate *)date:(NSString *)dateText dateFormat:(NSString *)dateFormat
{
    NSString *dateString = dateText;
    NSDateFormatter *dateFormater = [[NSDateFormatter alloc] init];
    [dateFormater setDateFormat:dateFormat];
    NSDate *date = [dateFormater dateFromString:dateString];
    return date;
}

// ピッカーで指定されている時間をテキストで取得
+ (NSString *)dateText:(NSString *)dateFormat
{
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    dateFormatter.dateFormat = dateFormat;
    return [dateFormatter stringFromDate:DCDate.datePicker.date];
}

// ピッカーで指定されている年取得
+ (NSInteger)pickerYear
{
    NSDateFormatter *yearFormatter = [[NSDateFormatter alloc] init];
    [yearFormatter setLocale:[NSLocale currentLocale]];
    [yearFormatter setDateFormat:@"yyyy"];
    NSString *pickerYear = [yearFormatter stringFromDate:DCDate.datePicker.date];
    return [pickerYear intValue];
}

// ピッカーで指定されている月取得
+ (NSInteger)pickerMonth
{
    NSDateFormatter *monthFormatter = [[NSDateFormatter alloc] init];
    [monthFormatter setLocale:[NSLocale currentLocale]];
    [monthFormatter setDateFormat:@"MM"];
    NSString *pickerMonth = [monthFormatter stringFromDate:DCDate.datePicker.date];
    return [pickerMonth intValue];
}

// ピッカーで指定されている日付取得
+ (NSInteger)pickerDay
{
    NSDateFormatter *dayFormatter = [[NSDateFormatter alloc] init];
    [dayFormatter setLocale:[NSLocale currentLocale]];
    [dayFormatter setDateFormat:@"dd"];
    NSString *pickerDay = [dayFormatter stringFromDate:DCDate.datePicker.date];
    return [pickerDay intValue];
}

// ピッカーで指定されている時刻(時)取得
+ (NSInteger)pickerHour
{
    NSDateFormatter *hourFormatter = [[NSDateFormatter alloc] init];
    [hourFormatter setLocale:[NSLocale currentLocale]];
    [hourFormatter setDateFormat:@"HH"];
    NSString *pickerHour = [hourFormatter stringFromDate:DCDate.datePicker.date];
    return [pickerHour intValue];
}

// ピッカーで指定されている時刻(分)取得
+ (NSInteger)pickerMinute
{
    NSDateFormatter *minuteFormatter = [[NSDateFormatter alloc] init];
    [minuteFormatter setLocale:[NSLocale currentLocale]];
    [minuteFormatter setDateFormat:@"mm"];
    NSString *pickerMinute = [minuteFormatter stringFromDate:DCDate.datePicker.date];
    return [pickerMinute intValue];
}

#pragma mark - Utils

// 現在の月を取得
+ (NSInteger)currentYear
{
    NSDateComponents *currentTimeComponents = [DCDate currentDateComponents];
    return currentTimeComponents.year;
}

// 現在の月を取得
+ (NSInteger)currentMonth
{
    NSDateComponents *currentTimeComponents = [DCDate currentDateComponents];
    return currentTimeComponents.month;
}

// 現在の日付を取得
+ (NSInteger)currentDay
{
    NSDateComponents *currentTimeComponents = [DCDate currentDateComponents];
    return currentTimeComponents.day;
}

// 現在の時間を取得
+ (NSInteger)currentHour
{
    NSDateComponents *currentTimeComponents = [DCDate currentDateComponents];
    return currentTimeComponents.hour;
}

// 現在の分数を取得
+ (NSInteger)currentMinute
{
    NSDateComponents *currentTimeComponents = [DCDate currentDateComponents];
    return currentTimeComponents.minute;
}

// 現在の秒数を取得
+ (NSInteger)currentSecond
{
    NSDateComponents *currentTimeComponents = [DCDate currentDateComponents];
    return currentTimeComponents.second;
}

// 現在時刻のコンポーネント取得
+ (NSDateComponents *)currentDateComponents
{
    // 現在の時刻を取得
    NSDate *nowDate = [NSDate date];

    // 現在時刻のコンポーネント定義
    NSDateComponents *nowComponents;
    nowComponents = [[NSCalendar currentCalendar] components:(NSYearCalendarUnit |
                                                              NSMonthCalendarUnit |
                                                              NSDayCalendarUnit |
                                                              NSHourCalendarUnit |
                                                              NSMinuteCalendarUnit |
                                                              NSSecondCalendarUnit)
                                                    fromDate:nowDate];
    return nowComponents;
}

#pragma mark - Decision

// ピッカーで指定されている日付が現在と同じであるか
+ (BOOL)isCurrentDate
{
    return ([DCDate currentYear] == [DCDate pickerYear] &&
            [DCDate currentMonth] == [DCDate pickerMonth] &&
            [DCDate currentDay] == [DCDate pickerDay]);
}

// ピッカーで指定されている時刻が現在時刻であるか
+ (BOOL)isCurrentTime
{
    return ([DCDate currentHour] == [DCDate pickerHour] &&
            [DCDate currentMinute] == [DCDate pickerMinute]);
}

#pragma mark - Since

typedef NS_ENUM(NSUInteger, dateUnitId) {
    SEC  = 0,
    MIN  = 1,
    HOUR = 2,
    DAY  = 3
};

// 指定した日付からの経過時間を取得
+ (CGFloat)since:(NSString *)referenceDateString targetDateString:(NSString *)targetDateString dateFormat:(NSString *)dateFormat dateUnit:(NSUInteger)dateUnit
{
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    [dateFormatter setLocale:[NSLocale systemLocale]];
    [dateFormatter setDateFormat:dateFormat];
    NSDate *referenceDate = [dateFormatter dateFromString:referenceDateString];
    NSDate *targetDate    = [dateFormatter dateFromString:targetDateString];
    NSTimeInterval since  = [targetDate timeIntervalSinceDate:referenceDate];
    if (dateUnit == SEC) {
        return since;
    } else if (dateUnit == MIN) {
        return since / 60;
    } else if (dateUnit == HOUR) {
        return since / (60 * 60);
    } else if (dateUnit == DAY) {
        return since / (24 * 60 * 60);
    }
    return since;
}

#pragma mark - setter/getter method

+ (void)setDatePicker:(UIDatePicker *)picker
{
    datePicker = picker;
}

+ (UIDatePicker *)datePicker
{
    return datePicker;
}

@end

お薦めの参考書

絶対に挫折しない iPhoneアプリ開発「超」入門 増補改訂第4版
Swiftについて知りたい開発者の方のみならず、プログラミング未経験者の方にも参考になる内容になっています。Swiftの基礎を一から丁寧に解説されており、この書籍があればネットで調べる手間をかなり省くことができると思います。

   このエントリーをはてなブックマークに追加

About

Masaki Hirokawa (@dolice_apps)

デザインエンジニア 廣川政樹の開発ブログ。Objective-Cや Javaなど iPhone/Androidアプリ開発に関する技術情報を掲載しています。

iPhone apps

  • リラックス・ヒーリング(無料)
  • 望みが叶う!引き寄せの法則アプリ(無料)
  • ミステリー - 怖い話や不思議な体験、都市伝説まとめ
  • 浮世絵壁紙 - 美しい日本画ギャラリー(無料)
  • 綺麗な壁紙HD iPhone 7/7 Plus/SE & iPod対応(無料)
  • クールな壁紙HD iPhone 7/7 Plus/SE & iPod対応(無料)

Android apps

  • 浮世絵壁紙 - 美しい日本画ギャラリー
  • 綺麗な高画質壁紙

Objective-C Classes

Tag Cloud

ActionScript(9) ActionScript3(7) Ad(4) Adfurikun(2) AdMob(9) Android(10) Animation(17) AppDelegate(3) ARC(1) ArrayList(1) AVAudioPlayer(4) AVAudioSession(1) AVFoundation(3) Banner(2) Bitmap(1) Camera(4) CGAffineTransform(4) CGBlendMode(2) CGContextRef(1) CGImageRef(1) Classes(44) CLLocationManager(1) ConnectivityManager(1) ContentResolver(1) CoreLocation(2) Delegate(3) Device(7) Display(1) DisplayMetrics(1) Download(101) Facebook(6) Foundation(72) Framework(2) Google Analytics(1) Handler(1) iAd(6) ImageView(1) In-AppPurchase(1) iOS(12) iOS 7(15) iOS 7.1(3) iOS 8(1) iPad(7) iPhone(21) iPhone 6(4) Java(7) JavaScript(2) LINE(4) Localize(1) Magazine(1) MediaStore(1) MFComposeViewController(1) Nend(1) NetworkInfo(1) NSArray(23) NSCalendar(3) NSData(2) NSDate(7) NSDateComponents(2) NSDateFormatter(2) NSDictionary(12) NSEnumerator(1) NSIndexSet(1) NSInteger(6) NSMutableArray(17) NSMutableDictionary(5) NSMutableOrderedSet(7) NSMutableString(4) NSMutableURLRequest(1) NSNotificationCenter(1) NSNumber(1) NSObject(1) NSOrderedSet(7) NSRange(2) NSSelectorFromString(1) NSSet(6) NSString(19) NSTimer(4) NSTimeZone(1) NSURL(7) NSURLConnection(1) NSURLRequest(2) NSUserDefaults(7) NSXMLParser(2) Objective-C(222) PHP(1) Products(14) QuartzCore(3) RSS(2) Runnable(1) Sample(51) Screensaver(9) SDK(2) ShareCompat(1) Social(10) StoreKit(1) Twitter(6) UIAccelerometer(3) UIActionSheet(1) UIActivityIndicator(1) UIActivityIndicatorView(3) UIActivityViewController(1) UIAlertView(5) UIApplication(7) UIButton(4) UIColor(3) UIDatePicker(5) UIDevice(6) UIDeviceOrientation(1) UIEvent(6) UIImage(15) UIImagePickerController(4) UIImageView(12) UIKit(58) UILabel(7) UINavigationBar(4) UINavigationItem(1) UIPasteboard(4) UIScreen(1) UIScrollBar(1) UIScrollView(1) UISlider(3) UIStoryboardSegue(3) UISwitch(1) UITabBar(3) UITableView(4) UITextField(2) UIView(11) UIViewAnimationTransition(1) UIViewController(4) UIWebView(5) WindowManager(1) Xcode(48) Xcode 5(8) Xcode 5.1(2)