给定一个 NSDate,找到前第四个月的最后一天

Posted

技术标签:

【中文标题】给定一个 NSDate,找到前第四个月的最后一天【英文标题】:Given an NSDate, find the last day of fourth prior month 【发布时间】:2015-02-24 21:01:47 【问题描述】:

我正在尝试根据当前日期计算 NSDate 对象。如果当前日期是 2015 年 4 月 1 日,我需要生成日期,2014 年 12 月 31 日。如果当前日期是 2015 年 4 月 30 日,我仍然需要生成日期,2014 年 12 月 31 日。但是,它是2015 年 5 月 1 日,我需要生成 2015 年 1 月 31 日。换句话说,无论我在哪个月份,我都需要从四个月前开始的月底日期,无论我在当前月份的哪个位置。

到目前为止我的代码是:

    NSCalendar *theCalendar = [NSCalendar currentCalendar];
    NSDateComponents *dayComponent = [[NSDateComponents alloc] init];
    [dayComponent setDay:-90];
    NSDate *nextDate = [theCalendar dateByAddingComponents:dayComponent toDate:[NSDate date] options:0];

    NSLog(@"The date I am getting is: %@", nextDate);

上面的代码给了我当前日期前 90 天的日期值,但我需要日期始终是 4 个月前的月底。

【问题讨论】:

你签出YLMoment了吗?我敢打赌它会帮助你做你需要的。 要知道,月底就是下月初的前一天。并且还有天以外的组件。而NSCalendarrangeOfUnit可以提供一些有用的信息。 【参考方案1】:

正如您已经发现的,您需要一个开始日期和一个日历:

NSDate *startingDate = [NSDate date];
NSCalendar *calendar = [NSCalendar autoupdatingCurrentCalendar];

您将需要当前日期的组成部分,但只需要到当前月份,因为您不关心月份中的具体日期:

NSDateComponents *components = [calendar
    components:NSCalendarUnitEra | NSCalendarUnitYear | NSCalendarUnitMonth
    fromDate:startingDate];

你说你想要前第四个月的最后一天。由于月份的天数不同,因此最后一天会因月份而异。但是所有月份都有第一天,而且这些第一天总是编号为 1。因此,通过首先回溯三个月来计算“前第四个月的最后一天”是最简单的:

components.month -= 3;

然后,去那个月的前一天:

components.day = -1;

最后,您需要清楚地知道NSDate 代表一个瞬间,但一天(如“2015 年 4 月 1 日”)是一个间隔 时间,在特定时刻开始和结束。如果您要使用NSDate 表示一整天,您将在该时间间隔内存储一个瞬间。您不想存储第一个或最后一个瞬间(都是午夜); that causes problems for some days in some time zones。相反,使用中午作为你的瞬间:

components.hour = 12;

现在您可以向日历询问新的NSDate

NSDate *lastDayOfFourthPriorMonth = [calendar dateFromComponents:components];

【讨论】:

【参考方案2】:

您想熟悉NSCalendarNSDateComponents。如果您阅读这两个 API 文档,您将能够组装答案。

从概念上讲,您想使用NSCalendar components:fromDate: 来获取当前日期的组成部分(日、月、年)。

然后,您将把该月的价值向后推 4 个月。现在,如果过了一月,您知道您需要确定多少,以便您在几个月内进行调整并保持 [1..12]。此外,此时您还需要减少年份。

知道月份,可以通过多种方式找到该月的最后一天;其中最粗略的方法是维护自己的枚举...但使用 NSCalendar 可能有更好的方法,它也将考虑闰年的二月。

最后,您可以使用 NSCalendar 方法 dateFromComponents: 从您组装的组件构建结果日期。

请参阅 @rob mayoff 的出色答案,这是对这一理论和 IMO 的更具体实现,正确答案。

【讨论】:

NSCalendar rangeOfUnit 会告诉您当月的最后一天,同时考虑到月份、闰年以及可能出现的任何其他异常情况。

以上是关于给定一个 NSDate,找到前第四个月的最后一天的主要内容,如果未能解决你的问题,请参考以下文章

在Objective-C的NSDate中获取一个月的天数?

获取本周的第一天和最后一天

如何从日期找到一个月的最后一天?

我如何获得一个月的最后一天?

用PHP获取下个月的最后一天?

在Python中获取下个月的最后一天[关闭]