我正在为iPhone编写一个GTD应用程序.对于应有的任务,我希望显示诸如"明天到期"或"到期日"或"到期7月18日"之类的内容.显然,即使任务距离不到24小时,我也需要显示"明天"(例如,用户在星期六晚上11点检查并看到周日早上8点有任务).所以,我写了一个方法来获取两个日期之间的天数.这是代码......
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"yyyy-MM-dd-HH-mm"];
NSDate *nowDate = [dateFormatter dateFromString:@"2010-01-01-15-00"];
NSDate *dueDate = [dateFormatter dateFromString:@"2010-01-02-14-00"];
NSLog(@"NSDate *nowDate = %@", nowDate);
NSLog(@"NSDate *dueDate = %@", dueDate);
NSCalendar *calendar = [NSCalendar currentCalendar];
NSDateComponents *differenceComponents = [calendar components:(NSDayCalendarUnit)
fromDate:nowDate
toDate:dueDate
options:0];
NSLog(@"Days between dates: %d", [differenceComponents day]);
Run Code Online (Sandbox Code Playgroud)
......这是输出:
NSDate *nowDate = 2010-01-01 15:00:00 -0700
NSDate *dueDate = 2010-01-02 14:00:00 -0700
Days between dates: 0
Run Code Online (Sandbox Code Playgroud)
如您所见,该方法返回不正确的结果.它应该返回1作为两天之间的天数.我在这做错了什么?
编辑:我写了另一种方法.我没有进行过广泛的单元测试,但到目前为止似乎有效:
+ (NSInteger)daysFromDate:(NSDate *)fromDate inTimeZone:(NSTimeZone *)fromTimeZone untilDate:(NSDate *)toDate inTimeZone:(NSTimeZone *)toTimeZone {
NSCalendar *calendar = …Run Code Online (Sandbox Code Playgroud) 一年有多少个星期?因为我在网上搜索过,我发现一年总共52.1周,但如果我在Xcode中这样做:
NSCalendar *gregorian = [[NSCalendar alloc]
initWithCalendarIdentifier:NSGregorianCalendar];
[gregorian setFirstWeekday:2];
NSDate* sourceDate = [NSDate date];
NSTimeZone* sourceTimeZone = [NSTimeZone timeZoneWithAbbreviation:@"GMT"];
NSTimeZone* destinationTimeZone = [NSTimeZone systemTimeZone];
NSInteger sourceGMTOffset = [sourceTimeZone secondsFromGMTForDate:sourceDate];
NSInteger destinationGMTOffset = [destinationTimeZone secondsFromGMTForDate:sourceDate];
NSTimeInterval interval = destinationGMTOffset - sourceGMTOffset;
NSDate* today = [[NSDate alloc] initWithTimeInterval:interval sinceDate:sourceDate];
NSDateComponents *todaysComponents = [gregorian components:NSWeekCalendarUnit fromDate:today];
NSUInteger todaysWeek = [todaysComponents week];
Run Code Online (Sandbox Code Playgroud)
今日周刊的价值是:53,怎么可能?为什么不是52?
我想找出一年中第一周的日期:
NSCalendar *calendar = [NSCalendar currentCalendar];
NSDateComponents *components = [[NSDateComponents alloc] init];
[components setYear:2013];
[components setMonth:1];
[components setWeekOfMonth:1];
[components setWeekday:1];
NSDate *newDate = [calendar dateFromComponents:components];
NSLog(@"%@",newDate);
Run Code Online (Sandbox Code Playgroud)
我得到的是:
2012-12-29 23:00:00 +0000
Run Code Online (Sandbox Code Playgroud)
当我与我的 mac 日历进行比较时,我需要得到的是:
2012-12-31 23:00:00 +0000
Run Code Online (Sandbox Code Playgroud)
有什么建议?
我需要得到这个月第一天的工作日.例如,对于2013年9月的当月,第一天是星期日.
我在 Swift 中使用以下 DateComponentsFormatter:
let formatter = DateComponentsFormatter()
formatter.unitsStyle = .positional
formatter.allowedUnits = [.hour, .minute, .second]
formatter.zeroFormattingBehavior = [.default]
Run Code Online (Sandbox Code Playgroud)
这会产生类似 2:41(2 分 41 秒)和 08(8 秒)的结果。但是,我想在 Minutes 位置至少保留一位数字,返回 0:08 而不是 08。这可能与 DateComponentsFormatter 一起使用吗?我更喜欢返回本地化结果的解决方案。
NSDate *today = [NSDate date];
NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
[calendar setTimeZone:[NSTimeZone timeZoneWithName:@"GMT+2"]];
NSDateComponents *dateComponents = [calendar components:(NSDayCalendarUnit | NSWeekdayCalendarUnit) fromDate:today];
NSInteger day = [dateComponents day];
NSInteger month = [dateComponents month];
NSInteger year = [dateComponents year];
NSLog(@" %i %i %i ", day, month, year);
Run Code Online (Sandbox Code Playgroud)
该代码显示"12 2147483647 2147483647"
我怎样才能获得月份和年份(整数)
如何添加/转发一天?(如果我们也是这个月的第一个!)
请你注意:-)
我必须从Date发送DDMMYYY日期以与API通信.
NSDateComponents*dateComponents; NSCalendar*格里高利; NSDate*日期;
gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
dateComponents = [[NSDateComponents alloc] init];
self.date = [gregorian dateByAddingComponents:dateComponents toDate:[NSDate date] options:0];
Run Code Online (Sandbox Code Playgroud)
我必须使用[dateComponents日]等等吗?是否有一些方法可以帮助我像PHP一样执行该任务?
我使用下面的Utility方法显示经过的秒,分钟,小时等.
例如,1小时前
我有一个朋友在海外测试我们的iPhone应用程序,每次他们提交一个项目时,该方法总是返回"1小时前",因为新西兰提前2小时,服务器托管在澳大利亚,显然落后2小时.
直到我们的SQL Server赶上; 当项目日期开始正确计算时.
只是想知道如何处理时区差异并修改我的效用方法以全局工作?请随意帮助修改方法,这样就不需要那么多行代码(如果你感到非常无聊 - 那么慷慨).
提前致谢.
+ (NSString *)elapsedTime:(NSDate *)date {
NSUInteger desiredComponents = NSYearCalendarUnit | NSMonthCalendarUnit | NSWeekCalendarUnit | NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit;
NSDateComponents *elapsedTimeUnits = [[NSCalendar currentCalendar] components:desiredComponents
fromDate:date
toDate:[NSDate date]
options:0];
// Format to be used to generate string to display.
NSString *scannedFormat = @"%d %@ ago";
NSInteger number = 0;
NSString *unit;
if ([elapsedTimeUnits year] > 0) {
number = [elapsedTimeUnits year];
unit = [NSString stringWithFormat:@"year"];
} else if …Run Code Online (Sandbox Code Playgroud) 我需要在应用程序的数据库中存储一个时间间隔,偶尔会添加NSDate.问题是,我不知道要为它选择什么数据类型.有些人建议存储NSTimeInterval,但是当用户的时区发生变化时会导致计算错误吗?也许最好存储NSDateComponents(作为"可转换"数据类型)还是有另一种更好的方法来存储它?
我想检查一个月内是否存在特定日期.但无法找到任何帮助.举个例子,我在Playground中尝试了下面的代码;
var components = DateComponents()
components.month = 2
components.year = 2016
components.day = 30
components.calendar = Calendar.current
components.date
Run Code Online (Sandbox Code Playgroud)
这给出了答案;
"Mar 1, 2016, 12:00 AM"
Run Code Online (Sandbox Code Playgroud)
所以它做的是它试图用TimeZones操纵并移动针.因此,我无法找到一种方法来检查特定日期和特定日期是否存在.任何人都可以指导.
nsdatecomponents ×10
ios ×7
nsdate ×7
iphone ×4
nscalendar ×3
swift ×3
calendar ×2
cocoa ×2
cocoa-touch ×2
date ×2
components ×1
core-data ×1
objective-c ×1