做App避免不了要和時間打交道抛猫,關(guān)于時間的處理,里面有不少門道刃泡,遠不是一行API調(diào)用巧娱,獲取當(dāng)前系統(tǒng)時間這么簡單。我們需要了解與時間相關(guān)的各種API之間的差別烘贴,再因場景而異去設(shè)計相應(yīng)的機制禁添。
-
當(dāng)前時間是否在fromHour和toHour之間
* @brief 判斷當(dāng)前時間是否在fromHour和toHour之間。如桨踪, fromHour=8老翘,toHour=23時,即為判斷當(dāng)前時間是否在8:00-23:00之間
- (BOOL)isBetweenFromHour:(NSInteger)fromHour toHour:(NSInteger)toHour
{
NSDate *fromData = [self getCustomDateWithHour:fromHour];
NSDate *toData = [self getCustomDateWithHour:toHour];NSDate *currentDate = [NSDate date]; if ([currentDate compare:fromData] == NSOrderedDescending && [currentDate compare:toData] == NSOrderedAscending) { NSLog(@"該時間在 %ld:00-%ld:00 之間锻离!", (long)fromHour, (long)toHour); return YES; } return NO; }
-
生成當(dāng)天的某個點
* @brief 生成當(dāng)天的某個點(返回的是倫敦時間铺峭,可直接與當(dāng)前時 間[NSDate date]比較)
* @param hour 如hour為“8”,就是上午8:00(本地時間)
- (NSDate *)getCustomDateWithHour:(NSInteger)hour
{
//獲取當(dāng)前時間
NSDate *currentDate = [NSDate date];
NSCalendar *currentCalendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSDateComponents *currentComps = [[NSDateComponents alloc] init];NSInteger unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSWeekdayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit; currentComps = [currentCalendar components:unitFlags fromDate:currentDate]; //設(shè)置當(dāng)天的某個點 NSDateComponents *resultComps = [[NSDateComponents alloc] init]; [resultComps setYear:[currentComps year]]; [resultComps setMonth:[currentComps month]]; [resultComps setDay:[currentComps day]]; [resultComps setHour:hour]; NSCalendar *resultCalendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; return [resultCalendar dateFromComponents:resultComps];
}
字符串轉(zhuǎn)時間
* @param dateString 時間字符串
* @param format 字符串格式 yyyy-MM-dd HH:mm:ss
+ (NSDate *)stringToDate:(NSString *)dateString format:(NSString *)format {
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat: format];
NSDate *destDate= [dateFormatter dateFromString:dateString];
return destDate;
}時間轉(zhuǎn)字符串
+ (NSString *)dateToString:(NSDate *)date format:(NSString )format {
NSDateFormatter dateFormat = [[NSDateFormatter alloc] init];
[dateFormat setDateFormat:format];
NSString *dateString = [dateFormat stringFromDate:date];
return dateString;
}時間差
+ (NSTimeInterval)timeIntervalBetween:(NSDate *)beginDate and:(NSDate *)endDate
{
NSTimeInterval begin = [beginDate timeIntervalSince1970];
NSTimeInterval end = [endDate timeIntervalSince1970];
NSTimeInterval sub = end - begin;
return sub;
}生成時間戳 (時間戳:從1970年1月1號 00:00:00開始走過的毫秒數(shù))
+(NSString *)createTimestamp
{
NSDate *datenow=[NSDate date];
NSTimeZone *zone = [NSTimeZone systemTimeZone];
NSInteger interval = [zone secondsFromGMTForDate:datenow];
NSDate *localeDate = [datenow dateByAddingTimeInterval: interval];
return [NSString stringWithFormat:@"%ld",(long)[localeDate timeIntervalSince1970]];
}時間轉(zhuǎn)時間戳
+ (NSString *)parseParamDate:(NSDate *)date
{
NSTimeInterval time = [date timeIntervalSince1970] * 1000;
return [NSString stringWithFormat:@"\/Date(%lld+0800)\/", (long long)time];
}時間戳轉(zhuǎn)時間
+ (NSDate *)getDate:(NSString *)jsonValue
{
NSRange range = [jsonValue rangeOfString:@"\d{13}" options:NSRegularExpressionSearch];
if (range.location == NSNotFound) {
return nil;
}
NSString *value = [jsonValue substringWithRange:range];
NSDate *result = [NSDate dateWithTimeIntervalSince1970:[value doubleValue]/1000];
return result;
}-
將本地日期字符串轉(zhuǎn)為UTC日期字符串
//本地日期格式:2013-08-03 12:53:51
//可自行指定輸入輸出格式
-(NSString *)getUTCFormateLocalDate:(NSString *)localDate
{
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
//輸入格式
[dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];NSDate *dateFormatted = [dateFormatter dateFromString:localDate]; NSTimeZone *timeZone = [NSTimeZone timeZoneWithName:@"UTC"]; [dateFormatter setTimeZone:timeZone]; //輸出格式 [dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ssZ"]; NSString *dateString = [dateFormatter stringFromDate:dateFormatted]; return dateString; }
-
將UTC日期字符串轉(zhuǎn)為本地時間字符串
//輸入的UTC日期格式2013-08-03T04:53:51+0000
-(NSString *)getLocalDateFormateUTCDate:(NSString *)utcDate
{
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
//輸入格式
[dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ssZ"];
NSTimeZone *localTimeZone = [NSTimeZone localTimeZone];
[dateFormatter setTimeZone:localTimeZone];NSDate *dateFormatted = [dateFormatter dateFromString:utcDate]; //輸出格式 [dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"]; NSString *dateString = [dateFormatter stringFromDate:dateFormatted]; return dateString; }
時間描述
#import <Foundation/Foundation.h>
@interface NSDate (CZH)
/// 日期描述字符串
/// 格式如下
/// - 剛剛(一分鐘內(nèi))
/// - X分鐘前(一小時內(nèi))
/// - X小時前(當(dāng)天)
/// - 昨天 HH:mm(昨天)
/// - MM-dd HH:mm(一年內(nèi))
/// - yyyy-MM-dd HH:mm(更早期)
- (NSString *)czh_dateDescription;
@end
#import "NSDate+CZH.h"
@implementation NSDate (CZH)
- (NSString *)czh_dateDescription
{
// 1. 獲取當(dāng)前日歷
NSCalendar *calendar = [NSCalendar currentCalendar];
// 2. 判斷是否是今天
if ([calendar isDateInToday:self]) {
NSInteger interval = ABS((NSInteger)[self timeIntervalSinceNow]);
if (interval < 60) {
return @"剛剛";
}
interval /= 60;
if (interval < 60) {
return [NSString stringWithFormat:@"%zd 分鐘前", interval];
}
return [NSString stringWithFormat:@"%zd 小時前", interval / 60];
}
// 3. 昨天
NSMutableString *formatString = [NSMutableString stringWithString:@" HH:mm"];
if ([calendar isDateInYesterday:self]) {
[formatString insertString:@"昨天" atIndex:0];
} else {
[formatString insertString:@"MM-dd" atIndex:0];
// 4. 是否當(dāng)年
NSDateComponents *components = [calendar components:NSCalendarUnitYear fromDate:self toDate:[NSDate date] options:0];
if (components.year != 0) {
[formatString insertString:@"yyyy-" atIndex:0];
}
}
// 5. 轉(zhuǎn)換格式字符串
NSDateFormatter *fmt = [[NSDateFormatter alloc] init];
fmt.locale = [NSLocale localeWithLocaleIdentifier:@"en"];
fmt.dateFormat = formatString;
return [fmt stringFromDate:self];
}
@end