Files
OrderScheduling/Pods/BRPickerView/BRPickerView/DatePickerView/NSDate+BRPickerView.m
2023-10-24 10:09:59 +08:00

322 lines
10 KiB
Objective-C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//
// NSDate+BRPickerView.m
// BRPickerViewDemo
//
// Created by renbo on 2018/3/15.
// Copyright © 2018 irenb. All rights reserved.
//
// 最新代码下载地址https://github.com/91renb/BRPickerView
#import "NSDate+BRPickerView.h"
#import "BRPickerViewMacro.h"
BRSYNTH_DUMMY_CLASS(NSDate_BRPickerView)
static const NSCalendarUnit unitFlags = (NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay | NSCalendarUnitWeekOfMonth | NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond | NSCalendarUnitWeekday | NSCalendarUnitWeekdayOrdinal);
@implementation NSDate (BRPickerView)
#pragma mark - 获取日历单例对象
+ (NSCalendar *)br_calendar {
static NSCalendar *sharedCalendar = nil;
if (!sharedCalendar) {
// 创建日历对象,指定日历的算法(公历/阳历)
sharedCalendar = [[NSCalendar alloc]initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
// NSCalendar 设置时区
//sharedCalendar.timeZone = [NSTimeZone timeZoneWithName:@"America/Chicago"];
}
return sharedCalendar;
}
#pragma mark - NSDate 转 NSDateComponents
+ (NSDateComponents *)br_componentsFromDate:(NSDate *)date {
// 通过日历类 NSCalendar 进行转换
NSCalendar *calendar = [self br_calendar];
// NSDateComponents 可以获得日期的详细信息,即日期的组成
return [calendar components:unitFlags fromDate:date];
}
#pragma mark - NSDateComponents 转 NSDate
+ (NSDate *)br_dateFromComponents:(NSDateComponents *)components {
// 通过日历类 NSCalendar 进行转换
NSCalendar *calendar = [self br_calendar];
return [calendar dateFromComponents:components];
}
#pragma mark - 获取指定日期的年份
- (NSInteger)br_year {
return [NSDate br_componentsFromDate:self].year;
}
#pragma mark - 获取指定日期的月份
- (NSInteger)br_month {
return [NSDate br_componentsFromDate:self].month;
}
#pragma mark - 获取指定日期的天
- (NSInteger)br_day {
return [NSDate br_componentsFromDate:self].day;
}
#pragma mark - 获取指定日期的小时
- (NSInteger)br_hour {
return [NSDate br_componentsFromDate:self].hour;
}
#pragma mark - 获取指定日期的分钟
- (NSInteger)br_minute {
return [NSDate br_componentsFromDate:self].minute;
}
#pragma mark - 获取指定日期的秒
- (NSInteger)br_second {
return [NSDate br_componentsFromDate:self].second;
}
#pragma mark - 获取指定日期的星期
- (NSInteger)br_weekday {
return [NSDate br_componentsFromDate:self].weekday;
}
#pragma mark - 获取指定日期的星期
- (NSString *)br_weekdayString {
switch (self.br_weekday - 1) {
case 0:
{
return @"周日";
}
break;
case 1:
{
return @"周一";
}
break;
case 2:
{
return @"周二";
}
break;
case 3:
{
return @"周三";
}
break;
case 4:
{
return @"周四";
}
break;
case 5:
{
return @"周五";
}
break;
case 6:
{
return @"周六";
}
break;
default:
break;
}
return @"";
}
/// ---------------- 创建 date ----------------
#pragma mark - 通过 NSDateComponents对象 来创建 NSDate对象可以设置时区
+ (nullable NSDate *)br_setDateFromComponents:(NSDateComponents *)components timeZone:(NSTimeZone *)timeZone {
// 创建日历对象,指定日历的算法(公历/阳历)
NSCalendar *calendar = [[NSCalendar alloc]initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
if (timeZone) {
// NSCalendar 设置时区
calendar.timeZone = timeZone;
}
return [calendar dateFromComponents:components];
}
#pragma mark - 创建date通过 NSCalendar 类来创建日期)
+ (NSDate *)br_setYear:(NSInteger)year month:(NSInteger)month day:(NSInteger)day hour:(NSInteger)hour minute:(NSInteger)minute second:(NSInteger)second {
NSDateComponents *components = [self br_componentsFromDate:[NSDate date]];
if (year > 0) {
// 初始化日期组件
components = [[NSDateComponents alloc]init];
components.year = year;
}
if (month > 0) {
components.month = month;
}
if (day > 0) {
components.day = day;
}
if (hour >= 0) {
components.hour = hour;
}
if (minute >= 0) {
components.minute = minute;
}
if (second >= 0) {
components.second = second;
}
return [self br_dateFromComponents:components];
}
+ (NSDate *)br_setYear:(NSInteger)year month:(NSInteger)month day:(NSInteger)day hour:(NSInteger)hour minute:(NSInteger)minute {
return [self br_setYear:year month:month day:day hour:hour minute:minute second:0];
}
+ (NSDate *)br_setYear:(NSInteger)year month:(NSInteger)month day:(NSInteger)day hour:(NSInteger)hour {
return [self br_setYear:year month:month day:day hour:hour minute:0 second:0];
}
+ (NSDate *)br_setYear:(NSInteger)year month:(NSInteger)month day:(NSInteger)day {
return [self br_setYear:year month:month day:day hour:0 minute:0 second:0];
}
+ (NSDate *)br_setYear:(NSInteger)year month:(NSInteger)month {
return [self br_setYear:year month:month day:0 hour:0 minute:0 second:0];
}
+ (NSDate *)br_setYear:(NSInteger)year {
return [self br_setYear:year month:0 day:0 hour:0 minute:0 second:0];
}
+ (NSDate *)br_setMonth:(NSInteger)month day:(NSInteger)day hour:(NSInteger)hour minute:(NSInteger)minute {
return [self br_setYear:0 month:month day:day hour:hour minute:minute second:0];
}
+ (NSDate *)br_setMonth:(NSInteger)month day:(NSInteger)day {
return [self br_setYear:0 month:month day:day hour:0 minute:0 second:0];
}
+ (NSDate *)br_setHour:(NSInteger)hour minute:(NSInteger)minute second:(NSInteger)second {
return [self br_setYear:0 month:0 day:0 hour:hour minute:minute second:second];
}
+ (NSDate *)br_setHour:(NSInteger)hour minute:(NSInteger)minute {
return [self br_setYear:0 month:0 day:0 hour:hour minute:minute second:0];
}
+ (NSDate *)br_setMinute:(NSInteger)minute second:(NSInteger)second {
return [self br_setYear:0 month:0 day:0 hour:0 minute:minute second:second];
}
#pragma mark - 获取某个月的天数(通过年月求每月天数)
+ (NSUInteger)br_getDaysInYear:(NSInteger)year month:(NSInteger)month {
BOOL isLeapYear = year % 4 == 0 ? (year % 100 == 0 ? (year % 400 == 0 ? YES : NO) : YES) : NO;
switch (month) {
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
{
return 31;
}
case 4:
case 6:
case 9:
case 11:
{
return 30;
}
case 2:
{
if (isLeapYear) {
return 29;
} else {
return 28;
}
}
default:
break;
}
return 0;
}
#pragma mark - 获取 日期加上/减去某天数后的新日期
- (NSDate *)br_getNewDateToDays:(NSTimeInterval)days {
// days 为正数时,表示几天之后的日期;负数表示几天之前的日期
return [self dateByAddingTimeInterval:60 * 60 * 24 * days];
}
#pragma mark - NSDate 转 NSString
+ (NSString *)br_stringFromDate:(NSDate *)date dateFormat:(NSString *)dateFormat {
return [self br_stringFromDate:date dateFormat:dateFormat timeZone:nil language:nil];
}
#pragma mark - NSDate 转 NSString
+ (NSString *)br_stringFromDate:(NSDate *)date
dateFormat:(NSString *)dateFormat
timeZone:(NSTimeZone *)timeZone
language:(NSString *)language {
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
// 设置日期格式
dateFormatter.dateFormat = dateFormat;
// NSDateFormatter 设置时区 ,不设置默认为系统时区
if (timeZone) {
dateFormatter.timeZone = timeZone;
}
if (!language) {
language = [NSLocale preferredLanguages].firstObject;
}
dateFormatter.locale = [[NSLocale alloc]initWithLocaleIdentifier:language];
NSString *dateString = [dateFormatter stringFromDate:date];
return dateString;
}
#pragma mark - NSString 转 NSDate
+ (NSDate *)br_dateFromString:(NSString *)dateString dateFormat:(NSString *)dateFormat {
return [self br_dateFromString:dateString dateFormat:dateFormat timeZone:nil language:nil];
}
#pragma mark - NSString 转 NSDate
+ (NSDate *)br_dateFromString:(NSString *)dateString
dateFormat:(NSString *)dateFormat
timeZone:(NSTimeZone *)timeZone
language:(NSString *)language {
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
// 设置日期格式
dateFormatter.dateFormat = dateFormat;
// 设置时区
if (!timeZone) {
timeZone = [self currentTimeZone];
}
if (!language) {
language = [NSLocale preferredLanguages].firstObject;
}
dateFormatter.timeZone = timeZone;
dateFormatter.locale = [[NSLocale alloc]initWithLocaleIdentifier:language];
// 如果当前时间不存在,就获取距离最近的整点时间
dateFormatter.lenient = YES;
return [dateFormatter dateFromString:dateString];
}
#pragma mark - 获取当前时区(不使用夏时制)
+ (NSTimeZone *)currentTimeZone {
// 当前时区
NSTimeZone *localTimeZone = [NSTimeZone localTimeZone];
// 当前时区相对于GMT(零时区)的偏移秒数
NSInteger interval = [localTimeZone secondsFromGMTForDate:[NSDate date]];
// 当前时区(不使用夏时制)由偏移量获得对应的NSTimeZone对象
// 注意:一些夏令时时间 NSString 转 NSDate 时,默认会导致 NSDateFormatter 格式化失败,返回 null
return [NSTimeZone timeZoneForSecondsFromGMT:interval];
}
#pragma mark - NSDate 转 NSString已弃用
+ (NSString *)br_getDateString:(NSDate *)date format:(NSString *)format {
return [self br_stringFromDate:date dateFormat:format];
}
#pragma mark - NSString 转 NSDate已弃用
+ (NSDate *)br_getDate:(NSString *)dateString format:(NSString *)format {
return [self br_dateFromString:dateString dateFormat:format];
}
@end