我们在开发过程中会在很多地方用到NSDate,系统会提供一些方法供我们去使用,但是也有很多是直接获取不到的,接下来就把一些常用的NSDate的类扩展贴出来
+ (BOOL)is12HourFormat;
+ (NSDateFormatter*)getHourFormat;
- (BOOL)isSameDay:(NSDate *)date;
- (BOOL)isSameWeek:(NSDate *)date;
- (BOOL)isSunday;
- (NSInteger)getDateMonth;
- (NSInteger)getDateDay;
- (NSInteger)getDateHour;
- (NSInteger)getDateMinutes;
- (NSInteger)getBetweenDate:(NSDate *)date;
- (NSInteger)getWeek;
- (NSInteger)getDateYear;
- (NSInteger)getToday;
+ (NSString *)getCurrentDateString;
+(NSInteger )getUnixTime; //使用当前Unix时间
+(NSInteger )getBootTime; // 获取设备上次重启的unix time
// 记录一下本地时间和服务器时间的差值
+(void)setServerTimestamp:(NSInteger )serverTimestamp;
//返回当前服务器时间
+(NSDate *)nowServer;
//获取具体某个时间点的时间戳
+(NSInteger )getTime: (NSInteger)hour andMinute:(NSInteger)minute andSeconds:(NSInteger)seconds;
/**
字符串转时间戳 如:2017-4-10 17:15:10
@param formatTime 时间
@return 时间戳
*/
+ (NSString *)getOtherTimeStrWithString:(NSString *)formatTime;
//获取某一天的23:59:59点的时间戳
+(NSTimeInterval )getTimeAt24WithDate:(NSDate *)date;
//获取某一天的0点的时间戳
+(NSTimeInterval )getTimeAt00WithDate:(NSDate *)date;
//获取距离当前日期不同天前、后的日期
+(NSDate *)getDate:(NSDate *)currentDate day:(NSInteger)day;
//通过时间戳获得当前日期字符串
+ (NSString *)getDateStringWithTimeseconds:(NSString *)str;
//获取当前时间戳
+ (NSString *)getNowTimestamp;
实现部分
#include <sys/sysctl.h>
#pragma mark 是不是12小时制度
+ (BOOL)is12HourFormat {
NSString *formatStringForHours = [NSDateFormatter dateFormatFromTemplate:@"j" options:0 locale:[NSLocale currentLocale]];
NSRange containsA = [formatStringForHours rangeOfString:@"a"];
BOOL hasAMPM = containsA.location != NSNotFound;
if (hasAMPM) {
return YES;
}
return NO;
}
- (BOOL)isSameDay:(NSDate *)date{
NSCalendar* calendar = [NSCalendar currentCalendar];
unsigned unitFlags = NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay;
NSDateComponents* comp1 = [calendar components:unitFlags fromDate:date];
NSDateComponents* comp2 = [calendar components:unitFlags fromDate:self];
return [comp1 day] == [comp2 day] &&
[comp1 month] == [comp2 month] &&
[comp1 year] == [comp2 year];
}
- (BOOL)isSunday {
NSCalendar* calendar = [NSCalendar currentCalendar];
NSInteger week = [[calendar components:NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay | NSCalendarUnitWeekday fromDate:self] weekday];
if (week == 1) {
return YES;
}
return NO;
}
- (NSInteger)getWeek {
NSCalendar* calendar = [NSCalendar currentCalendar];
NSInteger week = [[calendar components:NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay | NSCalendarUnitWeekday fromDate:self] weekday];
return week; // 1、周日 2、周一 3、周二 4、周三 5、周四 6、周五、 7、周六
}
- (NSInteger)getDateMonth {
// return Calendar.current.component(.hour, from: date)
return [[NSCalendar currentCalendar] component:NSCalendarUnitMonth fromDate:self];
}
- (NSInteger)getDateDay {
// return Calendar.current.component(.hour, from: date)
return [[NSCalendar currentCalendar] component:NSCalendarUnitDay fromDate:self];
}
- (NSInteger)getDateHour {
// return Calendar.current.component(.hour, from: date)
return [[NSCalendar currentCalendar] component:NSCalendarUnitHour fromDate:self];
}
- (NSInteger)getDateMinutes {
return [[NSCalendar currentCalendar] component:NSCalendarUnitMinute fromDate:self];
}
- (NSInteger)getDateYear
{
return [[NSCalendar currentCalendar] component:NSCalendarUnitYear fromDate:self];
}
- (NSInteger)getToday
{
return [[NSCalendar currentCalendar] component:NSCalendarUnitDay fromDate:self];
}
//NSCurrentLocaleDidChangeNotification 当系统的区域格式,或者时间格式(是否24小时制)改变时
//UIApplicationSignificantTimeChangeNotification 当新的一天来到,或者说当运营商时间更新的时候
#pragma mark 判断是否是同一周
- (BOOL)isSameWeek:(NSDate *)date {
// 日历对象
NSCalendar *calendar = [NSCalendar currentCalendar];
// 一周开始默认为星期天=1。
calendar.firstWeekday = 1;
unsigned unitFlag = NSCalendarUnitWeekOfYear | NSCalendarUnitYearForWeekOfYear;
NSDateComponents *comp1 = [calendar components:unitFlag fromDate:date];
NSDateComponents *comp2 = [calendar components:unitFlag fromDate:self];
/// 年份和周数相同,即判断为同一周
/// NSCalendarUnitYearForWeekOfYear已经帮转换不同年份的周所属了,比如2019.12.31是等于2020的。这里不使用year,使用用yearForWeekOfYear
return (([comp1 yearForWeekOfYear] == [comp2 yearForWeekOfYear]) && ([comp1 weekOfYear] == [comp2 weekOfYear]));
}
#pragma mark 判断两个日期相差多少天
- (NSInteger)getBetweenDate:(NSDate *)date {
NSDateComponents * comp = [[NSCalendar currentCalendar] components:NSCalendarUnitDay fromDate:date toDate:self options:0];
return labs(comp.day);
}
+ (NSDateFormatter *)getHourFormat {
NSDateFormatter* df = [[NSDateFormatter alloc] init];
if([NSDate is12HourFormat]) {
[df setDateFormat:@"hh:mm aaa"];
}else{
[df setDateFormat:@"HH:mm"];
}
return df;
}
+ (NSInteger)getUnixTime
{
NSTimeInterval time=[[NSDate date] timeIntervalSince1970];
long long int currentTime = (long long int)time;
NSString *unixTime = [NSString stringWithFormat:@"%lld000", currentTime];
return [unixTime integerValue] /1000;
}
+ (NSInteger )getBootTime{ //获取方法,单位是秒
struct timeval boottime;
int mib[2] = {CTL_KERN, KERN_BOOTTIME};
size_t size = sizeof(boottime);
time_t now;
(void)time(&now);
if (sysctl(mib, 2, &boottime, &size, NULL, 0) != -1){
return boottime.tv_sec;
}
return 0;
}
+ (void)setServerTimestamp:(NSInteger)serverTimestamp
{
// 记录当前服务器时间
NSInteger rumtimes = [NSDate getUnixTime] - [NSDate getBootTime];
[User_Default setObject:@(serverTimestamp - rumtimes) forKey:@"kServerTimestamp"];
}
+ (NSDate *)nowServer
{
NSInteger serverTime = [[User_Default objectForKey:@"kServerTimestamp"]integerValue];
if (serverTime == 0) {
// 服务器时间还没缓存下来,这时候使用本地时间
return [NSDate date];
}
NSInteger runtimes = 0;
runtimes = [NSDate getUnixTime] - [NSDate getBootTime];
NSInteger currentTime = 0;
currentTime = serverTime + runtimes;
NSDate *date = [NSDate dateWithTimeIntervalSince1970:currentTime];
return date;
}
+ (NSInteger )getTime: (NSInteger)hour andMinute:(NSInteger)minute andSeconds:(NSInteger)seconds{
NSCalendar *greCalendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
NSTimeZone *timeZone = [[NSTimeZone alloc] init];
[greCalendar setTimeZone: timeZone];
NSDateComponents *dateComponents = [greCalendar components:NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay fromDate:[NSDate nowServer]];
// 定义一个NSDateComponents对象,设置一个时间点
NSDateComponents *dateComponentsForDate = [[NSDateComponents alloc] init];
[dateComponentsForDate setDay:dateComponents.day];
[dateComponentsForDate setMonth:dateComponents.month];
[dateComponentsForDate setYear:dateComponents.year];
[dateComponentsForDate setHour:hour];
[dateComponentsForDate setMinute:minute];
[dateComponentsForDate setSecond:seconds];
NSDate *dateFromDateComponentsForDate = [greCalendar dateFromComponents:dateComponentsForDate];
return (long)[dateFromDateComponentsForDate timeIntervalSince1970];
}
+ (NSString *)getOtherTimeStrWithString:(NSString *)formatTime{
NSLog(@"formatTime - - - - - -%@",formatTime);
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateStyle:NSDateFormatterMediumStyle];
[formatter setTimeStyle:NSDateFormatterShortStyle];
[formatter setDateFormat:@"YYYY-MM-dd HH:mm:ss"]; //(@"YYYY-MM-dd hh:mm:ss") ----------设置你想要的格式,hh与HH的区别:分别表示12小时制,24小时制
//设置时区选择北京时间
NSTimeZone* timeZone = [NSTimeZone timeZoneWithName:@"Asia/Beijing"];
[formatter setTimeZone:timeZone];
NSDate* date = [formatter dateFromString:formatTime]; //------------将字符串按formatter转成nsdate
//时间转时间戳的方法:
NSInteger timeSp = [[NSNumber numberWithDouble:[date timeIntervalSince1970]] integerValue] * 1000;
NSLog(@"将某个时间转化成 时间戳timeSp:%ld",(long)timeSp); //时间戳的值
return [NSString stringWithFormat:@"%ld",(long)timeSp];
}
+ (NSString *)getCurrentDateString {
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"YYYY-MM-dd HH:mm:ss"];
NSDate *datenow = [NSDate date];
NSString *currentTimeString = [formatter stringFromDate:datenow];
return currentTimeString;
}
//获取某一天的24点的时间戳
+(NSTimeInterval )getTimeAt24WithDate:(NSDate *)date{
NSString * formatStr = @"YYYY-MM-dd";
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateStyle:NSDateFormatterMediumStyle];
[dateFormatter setTimeStyle:NSDateFormatterShortStyle];
[dateFormatter setDateFormat:formatStr];
NSTimeInterval time = date.timeIntervalSince1970 ;
NSDate *detaildate = [NSDate dateWithTimeIntervalSince1970:time] ;
NSString *currentTimeString = [dateFormatter stringFromDate: detaildate];
NSDate* result = [dateFormatter dateFromString:currentTimeString];
NSTimeInterval timeTenInt = [result timeIntervalSince1970] * 1000 + 86400000 -1;
return timeTenInt;
}
//获取某一天的23:59:59点的时间戳
+(NSTimeInterval )getTimeAt00WithDate:(NSDate *)date{
NSString * formatStr = @"YYYY-MM-dd";
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateStyle:NSDateFormatterMediumStyle];
[dateFormatter setTimeStyle:NSDateFormatterShortStyle];
[dateFormatter setDateFormat:formatStr];
NSTimeInterval time = date.timeIntervalSince1970;
NSDate *detaildate = [NSDate dateWithTimeIntervalSince1970:time] ;
NSString *currentTimeString = [dateFormatter stringFromDate: detaildate];
NSDate* result = [dateFormatter dateFromString:currentTimeString];
NSTimeInterval timeTenInt = [result timeIntervalSince1970] * 1000;
return timeTenInt;
}
//获取距离当前日期不同天前、后的日期
+(NSDate *)getDate:(NSDate *)currentDate day:(NSInteger)day {
NSTimeInterval days = 24 * 60 * 60 * day; // 一天一共有多少秒
NSDate *appointDate = [currentDate dateByAddingTimeInterval:days];
return appointDate;
}
// 时间戳转时间,时间戳为13位是精确到毫秒的,10位精确到秒
+ (NSString *)getDateStringWithTimeseconds:(NSString *)str{
NSTimeInterval time=[str doubleValue]/1000;//传入的时间戳str如果是精确到毫秒的记得要/1000
NSDate *detailDate=[NSDate dateWithTimeIntervalSince1970:time];
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; //实例化一个NSDateFormatter对象
//设定时间格式,这里可以设置成自己需要的格式
[dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm ss"];
NSString *currentDateStr = [dateFormatter stringFromDate: detailDate];
return currentDateStr;
}
// 时间转时间戳到分
+(NSString *)getNowTimestamp{
NSDate *currentDate = [NSDate date];
if ([AppUtil shared].ispayPal) {//如果是睡眠挑战赛则使用服务器时间
currentDate = [NSDate nowServer];
}
NSTimeInterval time=[currentDate timeIntervalSince1970]*1000;
NSString *timeString = [NSString stringWithFormat:@"%.0f", time];
return timeString;
}
网友评论