- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我对 iOS 还是有点陌生,对 NSDate 有点吃力。基本上我的应用程序中有某些 CostPeriods:
CostPeriodDaily
CostPeriodWeekly
CostPeriodMonthly
CostPeriodSemiAnnually
CostPeriodAnnually
根据 CostPeriod,我想要该特定时间段的开始和结束日期。 CostPeriodDaily 当然是从(即今天)16.Feb 2014 00:00:00(本地时间)到 16.Feb 2014 23:59:59(本地时间)。每月将从 01.Feb 2014 00:00:00 - 28.Feb 2014 23:59:59 等
我首先有两个具体问题:
现在到我的 endDate 函数,还有两个问题:-)
+(NSDate *)endDateForCurrentCostPeriod:(CostPeriod)costPeriod{ NSCalendar *公历 = [[NSCalendar 分配] initWithCalendarIdentifier:NSGregorianCalendar];
NSDateComponents *todayComponents =
[gregorian components:(NSDayCalendarUnit | NSWeekdayCalendarUnit | NSMonthCalendarUnit | NSYearCalendarUnit ) fromDate:[NSDate date]];
NSRange daysOfCurrentMonth = [gregorian rangeOfUnit:NSDayCalendarUnit inUnit:NSMonthCalendarUnit forDate:[NSDate date]];
NSDateComponents *endDateComponents = [[NSDateComponents alloc] init];
switch (costPeriod) {
case CostPeriodDaily:
[endDateComponents setDay:[todayComponents day]];
[endDateComponents setMonth:[todayComponents month]];
[endDateComponents setYear:[todayComponents year]];
break;
case CostPeriodWeekly:
//Weekday 1 = sunday, 2 = monday
if([todayComponents weekday] == 1){
//Sunday -> do nothing, we have the end date
[endDateComponents setDay:[todayComponents day]];
[endDateComponents setMonth:[todayComponents month]];
[endDateComponents setYear:[todayComponents year]];
} else {
// all other days of current week, so 8- weekday (if Friday: 8 - 6 = + 2 -> Sunday)
NSDateComponents *componentsToAdd = [[NSDateComponents alloc] init];
[componentsToAdd setDay: 8 - [todayComponents weekday]];
NSDate *endOfWeek = [gregorian dateByAddingComponents:componentsToAdd
toDate:[NSDate date] options:0];
NSDateComponents *endOfWeekComponents = [gregorian components:(NSDayCalendarUnit | NSMonthCalendarUnit | NSYearCalendarUnit) fromDate:endOfWeek];
[endDateComponents setDay:[endOfWeekComponents day]];
[endDateComponents setMonth:[endOfWeekComponents month]];
[endDateComponents setYear:[endOfWeekComponents year]];
}
break;
case CostPeriodMonthly:
[endDateComponents setDay:daysOfCurrentMonth.length];
[endDateComponents setMonth:[todayComponents month]];
[endDateComponents setYear:[todayComponents year]];
break;
case CostPeriodSemiAnnually:
[endDateComponents setYear:[todayComponents year]];
if([todayComponents month] <= 6){
[endDateComponents setDay:30];
[endDateComponents setMonth:6];
} else {
[endDateComponents setDay:31];
[endDateComponents setMonth:12];
}
break;
case CostPeriodAnnually:
[endDateComponents setDay:31];
[endDateComponents setMonth:12];
[endDateComponents setYear:[todayComponents year]];
break;
default:
[endDateComponents setDay:daysOfCurrentMonth.length];
[endDateComponents setMonth:[todayComponents month]];
[endDateComponents setYear:[todayComponents year]];
break;
}
NSDate *endDate = [gregorian dateFromComponents:endDateComponents];
return endDate;
最佳答案
NSWeekdayCalendarUnit: Is 1 ALWAYS Sunday and 7 Saturday? No matter what locale is set?
没错。但这并不意味着 1=Sunday 总是被认为是一周中的第一天。 NSCalendar
有一个 firstWeekDay
方法,那个取决于语言环境。 (例如,在德国,星期一 是一周的第一天。)
If I NSLog my endDate (as in the following code) or start date it usually is the date and 23:00:00 since I'm living in the time zone GMT+1. Is this correct?
没错。
Is this function in general ok or will I run in some problems depending on specific locale settings?
您的方法看起来过于复杂。确定您可以使用的时间段
NSDate *now = [NSDate date];
NSCalendar *cal = [NSCalendar currentCalendar];
NSDate *startOfPeriod, *endOfPeriod;
NSTimeInterval lengthOfPeriod;
NSCalendarUnit unit = NSDayCalendarUnit; // or NSWeekCalendarUnit, NSMonthCalendarUnit, ...
[cal rangeOfUnit:unit startDate:&startOfPeriod interval:&lengthOfPeriod forDate:now];
endOfPeriod = [startOfPeriod dateByAddingTimeInterval:lengthOfPeriod]
根据您的语言环境,这应该可以正常工作。对于今天的本周(星期日,2 月 16 日)在德国将给出结果
startOfPeriod = 2014-02-10 00:00:00 CET
endOfPeriod = 2014-02-17 00:00:00 CET
因为这里的一周从星期一开始。 (所以实际上 endOfPeriod
并不是结束该期间的开始,但下一期间的开始。)
对于半年度没有对应的NSCalendarUnit
,可以按如下方式进行:
NSDate *now = [NSDate date];
NSCalendar *cal = [NSCalendar currentCalendar];
// Compute start and end of the current year (as above):
NSDate *startOfYear, *endOfYear;
NSTimeInterval lengthOfYear;
NSCalendarUnit unit = NSYearCalendarUnit;
[cal rangeOfUnit:unit startDate:&startOfYear interval:&lengthOfYear forDate:now];
endOfYear = [startOfYear dateByAddingTimeInterval:lengthOfYear];
// Compute middle of the year:
NSDateComponents *halfYear = [[NSDateComponents alloc] init];
NSRange range = [cal rangeOfUnit:NSMonthCalendarUnit inUnit:NSYearCalendarUnit forDate:now];
halfYear.month = range.length/2;
NSDate *middleOfYear = [cal dateByAddingComponents:halfYear toDate:startOfYear options:0];
// Compare current date with middle of the year and set start/end of period:
NSDate *startOfPeriod, *endOfPeriod;
if ([now compare:middleOfYear] == NSOrderedAscending) {
startOfPeriod = startOfYear;
endOfPeriod = middleOfYear;
} else {
startOfPeriod = middleOfYear;
endOfPeriod = endOfYear;
}
编辑:在 Martin 的帮助下将所有内容更改为此。有效,但仍然对结束日期 +1 天 +1 小时的必要性感到困惑...
+ (NSDate *)startDateForCostPeriod:(CostPeriod)costPeriod withDate:(NSDate *)date
{
NSCalendar *calender = [NSCalendar currentCalendar];
NSDate *startOfPeriod;
NSTimeInterval lengthOfPeriod;
//If unit is not initialized here, semi annual throws always a caution message since no unit is initialized there
NSCalendarUnit unit = NSMonthCalendarUnit;
//For the SemiAnnual period we need date components
NSDateComponents *todayComponents =
[calender components:(NSDayCalendarUnit | NSMonthCalendarUnit | NSYearCalendarUnit ) fromDate:date];
NSDateComponents *startDateComponents = [[NSDateComponents alloc] init];
switch (costPeriod) {
case CostPeriodDaily:
unit = NSDayCalendarUnit;
break;
case CostPeriodWeekly:
unit = NSWeekCalendarUnit;
break;
case CostPeriodMonthly:
unit = NSMonthCalendarUnit;
break;
case CostPeriodSemiAnnually:
[startDateComponents setDay:1];
[startDateComponents setYear:[todayComponents year]];
if([todayComponents month] <= 6){
[startDateComponents setMonth:1];
} else {
[startDateComponents setMonth:7];
}
break;
case CostPeriodAnnually:
unit = NSYearCalendarUnit;
break;
default:
unit = NSMonthCalendarUnit;
break;
}
if(costPeriod != CostPeriodSemiAnnually){
[calender rangeOfUnit:unit startDate:&startOfPeriod interval:&lengthOfPeriod forDate:date];
return startOfPeriod;
} else {
return [calender dateFromComponents:startDateComponents];
}
}
+ (NSDate *)endDateForCostPeriod:(CostPeriod)costPeriod withDate:(NSDate *)date
{
NSCalendar *calender = [NSCalendar currentCalendar];
NSDate *startOfPeriod;
NSTimeInterval lengthOfPeriod;
//If unit is not initialized here, semi annual throws always a caution message since no unit is initialized there
NSCalendarUnit unit = NSMonthCalendarUnit;
//For the SemiAnnual period we need date components
NSDateComponents *todayComponents =
[calender components:(NSDayCalendarUnit | NSMonthCalendarUnit | NSYearCalendarUnit ) fromDate:date];
NSDateComponents *endDateComponents = [[NSDateComponents alloc] init];
switch (costPeriod) {
case CostPeriodDaily:
unit = NSDayCalendarUnit;
break;
case CostPeriodWeekly:
unit = NSWeekCalendarUnit;
break;
case CostPeriodMonthly:
unit = NSMonthCalendarUnit;
break;
case CostPeriodSemiAnnually:
[endDateComponents setYear:[todayComponents year]];
if([todayComponents month] <= 6){
[endDateComponents setDay:30];
[endDateComponents setMonth:6];
} else {
[endDateComponents setDay:31];
[endDateComponents setMonth:12];
}
break;
case CostPeriodAnnually:
unit = NSYearCalendarUnit;
break;
default:
unit = NSMonthCalendarUnit;
break;
}
if(costPeriod != CostPeriodSemiAnnually){
[calender rangeOfUnit:unit startDate:&startOfPeriod interval:&lengthOfPeriod forDate:date];
return [startOfPeriod dateByAddingTimeInterval:lengthOfPeriod];
} else {
//somehow if you take the date without a time it is always 1 day and 1 hour before. i.e. 16.2.2014 is 15.2.2014 22:00:00
//thats why you need to add 1 day and 1 hour!
NSDate *endDate = [calender dateFromComponents:endDateComponents];
NSDateComponents *componentsToAdd = [[NSDateComponents alloc] init];
[componentsToAdd setDay: 1];
[componentsToAdd setHour: 1];
endDate = [calender dateByAddingComponents:componentsToAdd
toDate:endDate options:0];
return endDate;
}
}
关于ios - 考虑语言环境设置等的一些 NSDate 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21811788/
我的应用程序中有两个 UIDatePicker 控件,一个配置了 UIDatePickerModeDate,另一个配置了 UIDatePickerModeTime。 我想配置一个 NSDate 对象,
我可以通过此代码获取 iPhone 的当前日期 NSDate *currentDate = [NSDate date]; NSDateFormatter *dateFormatter1 = [[NSD
我在 Swift 中有一个模型,它有一个名为 expirationDate 的 NSDate 字段,我想根据当前时间计算过期前的剩余小时数日期。 有没有一种简单的方法可以利用现有的 NSDate 功能
我将我的 NSDate 存储到一个文件中,该文件采用您在 NSDate 上调用描述时获得的国际格式。 但是,我不知道如何从字符串格式返回到 NSDate 对象。 NSDateFormatter 似乎仅
我有兴趣创建一种方法来查找当前日期是否落在任何给定日期的特定时间之间。这是一个调度程序,所以我想找到当前时间正在发生什么事件。每天都有相同的时间集:820-900、900-940、940-1020 等
我有一个约会时间: Friday, July 8, 2016 at 6:30:00 PM India Standard Time 我想要这样的约会时间: Friday, July 8, 2016 at
我有一个 NSDate 对象。假设它代表“1-10-2011” NSDate *date = [df dateFromString:@"2011-10-01 00:00:00"]; 由于我所在的时区,
我从 Django API 获取 NSString 2012-08-17T10:56:45.508205 作为时间。 我正在尝试使用以下代码将该字符串转换为 NSDate 对象: NSDateForm
我在获取一系列 NSDates 与另一个 NSDates 范围相交的天数时遇到问题。 场景 1: 主要范围:3月8日-6月8日 检查范围:4月8日-5月8日 那么相交的天数就是4月8日-5月8日的天数
我知道如何获取两个 NSDate 之间的差异,如下所示 NSTimeInterval timeInterval = [[NSDate date] timeIntervalSinceDate:anyPr
我需要根据另一个 NSDate 获取一天中特定时间的 NSDate。例如,如果我有一个代表 2015 年 5 月 10 日已知时间的 NSDate,我需要能够获得一个代表 2015 年 5 月 10
升级到1.2后出现编译错误: NSDate?! is not convertible to NSDate 代码: let dateCreated = photoCommentObjects[index
这是我的代码。但是一个错误说,不能用类型的参数列表调用 dateComponent... let fromDate = NSDate(timeIntervalSince1970: TimeInter
给定一个引用日期,我需要找到下面的“星期三”。 需要说明的是,如果引用日期是星期二,那么它应该返回同一周的星期三。 如果引用日期是星期三或更晚,则需要返回从下周开始的下一个星期三。 重要的是它不会返回
我有 NSDate* day1 和 NSDate* day2。我如何通过只复制第 1 天的年/月/日和第 2 天的小时/分钟/秒来制作 NSDate* day3? 最佳答案 unsigned unit
我有两个 NSDate 对象,我想要两者之间的差异,结果应该再次是一个 NSDate 对象。知道如何实现这一目标吗? 在这里,我试图解决一个独特的问题,我必须找出耗时,然后本地化耗时。如果我在 NSD
我试图强制用户使用日期选择器选择 future 的日期。我显然使用了compare:方法,但是,当我执行以下代码时,即使它与[NSDate date]相同的日期,它也会告诉执行if语句。这是我的代码:
我有两个用户选择的日期:开始日期和结束日期。它们是 NSDate 实例,我必须将它们作为 NSNumber 的参数发送。如何以秒为单位将它们转换为 NSNumber? 最佳答案 使用下面的代码: N
我对将 NSTimeInterval 转换为 NSDate 感到困惑,我有两个日期要比较,一个来自服务器,另一个在本地, 在服务器案例中,我以时间间隔格式获取日期,因此我也必须对本地数据执行相同的操作
我有一个从服务器获取的字符串 "yyyy-MM-dd'T'HH:mm:ss.SSS'Z"我通过这个 formate 将这个字符串转换成 NSDate。 class func convertUTCDat
我是一名优秀的程序员,十分优秀!