完整的时间计算
做App避免不了要和时间打交道,关于时间的处理,里面有不少门道,远不是一行API调用,获取当前系统时间这么简单。我们需要了解与时间相关的各种API之间的差别,再因场景而异去设计相应的机制。
-
当前时间是否在fromHour和toHour之间
* @brief 判断当前时间是否在fromHour和toHour之间。如, fromHour=8,toHour=23时,即为判断当前时间是否在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; }
-
生成当天的某个点
* @brief 生成当天的某个点(返回的是伦敦时间,可直接与当前时 间[NSDate date]比较)
* @param hour 如hour为“8”,就是上午8:00(本地时间)
- (NSDate *)getCustomDateWithHour:(NSInteger)hour
{
//获取当前时间
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]; //设置当天的某个点 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];
}
-
字符串转时间
* @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;
} -
时间转字符串
+ (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开始走过的毫秒数)
+(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]];
} -
时间转时间戳
+ (NSString *)parseParamDate:(NSDate *)date
{
NSTimeInterval time = [date timeIntervalSince1970] * 1000;
return [NSString stringWithFormat:@"\/Date(%lld+0800)\/", (long long)time];
} -
时间戳转时间
+ (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;
} -
将本地日期字符串转为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日期字符串转为本地时间字符串
//输入的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)
/// 日期描述字符串
/// 格式如下
/// - 刚刚(一分钟内)
/// - X分钟前(一小时内)
/// - X小时前(当天)
/// - 昨天 HH:mm(昨天)
/// - MM-dd HH:mm(一年内)
/// - yyyy-MM-dd HH:mm(更早期)
- (NSString *)czh_dateDescription;
@end
#import "NSDate+CZH.h"
@implementation NSDate (CZH)
- (NSString *)czh_dateDescription
{
// 1. 获取当前日历
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. 是否当年
NSDateComponents *components = [calendar components:NSCalendarUnitYear fromDate:self toDate:[NSDate date] options:0];
if (components.year != 0) {
[formatString insertString:@"yyyy-" atIndex:0];
}
}
// 5. 转换格式字符串
NSDateFormatter *fmt = [[NSDateFormatter alloc] init];
fmt.locale = [NSLocale localeWithLocaleIdentifier:@"en"];
fmt.dateFormat = formatString;
return [fmt stringFromDate:self];
}
@end