标签: nsdatecomponents

iPhone - 获取两个日期之间的天数

我正在为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)

iphone cocoa cocoa-touch nsdate nsdatecomponents

5
推荐指数
1
解决办法
6538
查看次数

NSDateComponents今年最后一周的周成分

一年有多少个星期?因为我在网上搜索过,我发现一年总共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?

iphone nsdatecomponents ios

5
推荐指数
1
解决办法
666
查看次数

NSCalendar dateFromComponents 返回错误的日期 2

我想找出一年中第一周的日期:

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)

有什么建议?

components calendar nsdate nsdatecomponents ios

5
推荐指数
1
解决办法
3482
查看次数

每月第一天的工作日

我需要得到这个月第一天的工作日.例如,对于2013年9月的当月,第一天是星期日.

cocoa-touch date nsdate nsdatecomponents ios

5
推荐指数
1
解决办法
2997
查看次数

Swift DateComponentsFormatter 删除前导零但在分钟位置至少保留一位

我在 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 一起使用吗?我更喜欢返回本地化结果的解决方案。

date nsdatecomponents ios swift nsdatecomponentsformatter

5
推荐指数
1
解决办法
2306
查看次数

NSDate,NSCalendar和NSDateComponents计时

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"

我怎样才能获得月份和年份(整数)

如何添加/转发一天?(如果我们也是这个月的第一个!)

请你注意:-)

iphone cocoa nsdate nscalendar nsdatecomponents

4
推荐指数
1
解决办法
8312
查看次数

将NSDate格式化为DDMMYYYY?

我必须从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一样执行该任务?

nsdate nscalendar nsdatecomponents ios

4
推荐指数
1
解决办法
7983
查看次数

iPhone/Objective-C - 帮助解决海外时区的NSDateComponents和NSCalendar问题

我使用下面的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)

iphone objective-c nsdate nscalendar nsdatecomponents

4
推荐指数
1
解决办法
564
查看次数

在Core Data中存储时间间隔的正确方法是什么?

我需要在应用程序的数据库中存储一个时间间隔,偶尔会添加NSDate.问题是,我不知道要为它选择什么数据类型.有些人建议存储NSTimeInterval,但是当用户的时区发生变化时会导致计算错误吗?也许最好存储NSDateComponents(作为"可转换"数据类型)还是有另一种更好的方法来存储它?

core-data nsdatecomponents nstimeinterval ios swift

4
推荐指数
1
解决办法
636
查看次数

给定年份和月份,该月份如何检查特定日期

我想检查一个月内是否存在特定日期.但无法找到任何帮助.举个例子,我在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操纵并移动针.因此,我无法找到一种方法来检查特定日期和特定日期是否存在.任何人都可以指导.

calendar nsdate nsdatecomponents ios swift

4
推荐指数
1
解决办法
1223
查看次数