1. 程式人生 > >iOS開發之日期格式轉換及時間間隔判斷

iOS開發之日期格式轉換及時間間隔判斷

0. 說明

  • 支援時間戳與日期、日期和字串的相互轉換;

  • 支援日期轉星期;

  • 支援以下時間段判斷:一分鐘內、一小時內、昨天、今天、明天、今年;

1. 具體程式碼

//
//  NSDateExt.h
//  SwiftExercises
//
//  Created by ADreamClusive on 20/11/2017.
//  Copyright © 2017 ADreamClusive. All rights reserved.
//

#import <Foundation/Foundation.h>

@interface NSDate (ZL)

/** 判斷是否是一分鐘內 */
- (BOOL)isInOneMinute;
/** 判斷是否是一小時內 */
- (BOOL)isInOneHour;
/** 判斷是否是昨天 */
- (BOOL)isYesterday;
/** 判斷是否是今天 */
- (BOOL)isToday;
/** 判斷是否是明天 */
- (BOOL)isTomorrow;
/** 判斷是否是今年 */
- (BOOL)isThisYear;

/** 日期字串轉時間戳 */
+ (NSInteger)timestampFromDateString:(NSString *)dateStr format:(NSString *)format;
/** 時間戳轉日期字串 */
+ (NSString *)stringFromTimestamp:(NSInteger)timeStamp withDateFormat:(NSString *)format;
/** 日期轉字串 */
+ (NSString *)stringFromDate:(NSDate *)date format:(NSString *)format;
/** 字串轉日期 */
+ (NSDate *)dateFromString:(NSString *)dateString format:(NSString *)format;

/** 日期轉week */
+ (NSString*)weekdayStringFromDate:(NSDate*)inputDate;
@end
//
//  NSDateExt.m
//  SwiftExercises
//
//  Created by ADreamClusive on 20/11/2017.
//  Copyright © 2017 ADreamClusive. All rights reserved.
//

#import "NSDateExt.h"

static NSDateFormatter *formatter_;

@implementation NSDate (ZL)

// 第一次使用這個類的時候呼叫
// 優化效能,減少頻繁的建立格式化物件
+ (void)initialize {
    [super initialize];
    formatter_ = [[NSDateFormatter alloc] init];
}

#pragma mark - 日期時間間隔判斷

- (BOOL)isInOneMinute
{
    formatter_.dateFormat = @"yyyyMMddHHmm";
    
    NSString *selfSecond = [formatter_ stringFromDate:self];
    NSString *nowSecond = [formatter_ stringFromDate:[NSDate date]];
    
    return [selfSecond isEqualToString:nowSecond];
}

- (BOOL)isInOneHour
{
    formatter_.dateFormat = @"yyyyMMddHH";
    
    NSString *selfHour = [formatter_ stringFromDate:self];
    NSString *nowHour = [formatter_ stringFromDate:[NSDate date]];
    
    return [selfHour isEqualToString:nowHour];
}

- (BOOL)isYesterday
{
    formatter_.dateFormat = @"yyyyMMdd";
    
    NSString *selfDay = [formatter_ stringFromDate:self];
    NSString *nowDay = [formatter_ stringFromDate:[NSDate date]];
    
    NSDate *selfDate = [formatter_ dateFromString:selfDay];
    NSDate *nowDate = [formatter_ dateFromString:nowDay];
    
    NSCalendar *calendar_ = [NSCalendar currentCalendar];
    NSCalendarUnit units = NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay;
    NSDateComponents *cmp = [calendar_ components:units fromDate:nowDate toDate:selfDate options:0];
    
    return cmp.year == 0 && cmp.month == 0 && cmp.day == -1;
}
- (BOOL)isToday
{
    formatter_.dateFormat = @"yyyyMMdd";
    
    NSString *selfDay = [formatter_ stringFromDate:self];
    NSString *nowDay = [formatter_ stringFromDate:[NSDate date]];
    
    return [selfDay isEqualToString:nowDay];
}

- (BOOL)isTomorrow
{
    formatter_.dateFormat = @"yyyyMMdd";
    
    NSString *selfDay = [formatter_ stringFromDate:self];
    NSString *nowDay = [formatter_ stringFromDate:[NSDate date]];
    
    NSDate *selfDate = [formatter_ dateFromString:selfDay];
    NSDate *nowDate = [formatter_ dateFromString:nowDay];
    
    NSCalendar *calendar_ = [NSCalendar currentCalendar];
    NSCalendarUnit units = NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay;
    NSDateComponents *cmp = [calendar_ components:units fromDate:nowDate toDate:selfDate options:0];
    
    return cmp.year == 0 && cmp.month == 0 && cmp.day == 1;
}

- (BOOL)isThisYear
{
    formatter_.dateFormat = @"yyyy";
    NSString *selfYear = [formatter_ stringFromDate:self];
    NSString *currentYear = [formatter_ stringFromDate:[NSDate date]];
    
    return [selfYear isEqualToString:currentYear];
}


#pragma mark - 日期時間-字串 轉換

+(NSInteger)timestampFromDateString:(NSString *)timeStr format:(NSString *)format {
    
    NSDate *date = [NSDate dateFromString:timeStr format:format];
    
    return [NSDate cTimestampFromDate:date];
}
+ (NSInteger)cTimestampFromDate:(NSDate *)date {
    
    return (long)[date timeIntervalSince1970];
}

+ (NSString *)stringFromTimestamp:(NSInteger)timeStamp withDateFormat:(NSString *)format {
    
    NSDate *date = [NSDate dateWithTimeIntervalSince1970:timeStamp];
    
    return [NSDate stringFromDate:date format:format];
}

+ (NSString *)stringFromDate:(NSDate *)date format:(NSString *)format {
    
    formatter_.dateFormat = format; //指定轉date得日期格式化形式
    
    return [formatter_ stringFromDate:date];
}

+ (NSDate *)dateFromString:(NSString *)dateString format:(NSString *)format {
    
    [formatter_ setTimeZone:[NSTimeZone localTimeZone]];
    
    formatter_.dateFormat = format;
    
    return [formatter_ dateFromString:dateString];
}

+ (NSString*)weekdayStringFromDate:(NSDate*)inputDate {
    
    NSArray *weekdays = [NSArray arrayWithObjects: [NSNull null], @"星期天", @"星期一", @"星期二", @"星期三", @"星期四", @"星期五", @"星期六", nil];
    
    NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
    
    NSTimeZone *timeZone = [NSTimeZone localTimeZone];
    
    [calendar setTimeZone: timeZone];
    
    NSCalendarUnit calendarUnit = NSCalendarUnitWeekday;
    
    NSDateComponents *theComponents = [calendar components:calendarUnit fromDate:inputDate];
    
    return [weekdays objectAtIndex:theComponents.weekday];
}
@end

2 使用示例

NSInteger timestamp = [NSDate timestampFromDateString:@"2018-12-18 12:00:00" format:@"YYYY-MM-dd HH:mm:ss"];

NSString *datestr = [NSDate stringFromTimestamp:timestamp withDateFormat:@"YYYY-MM-dd HH:mm:ss"];

NSString *datestr2 = [NSDate stringFromDate:[NSDate date] format:@"YYYY-MM-dd HH:mm:ss"];

NSDate *date = [NSDate dateFromString:datestr2 format:@"YYYY-MM-dd HH:mm:ss"];

NSString *weekstr = [NSDate weekdayStringFromDate:date];

self.messageLabel.text = [NSString stringWithFormat:@"%ld  %@\n%@ %@\n%@", timestamp, datestr, datestr2, date, weekstr];