【问题标题】:Time Left Until Date (At Midnight?)距离日期还剩多少时间(午夜?)
【发布时间】:2012-08-13 01:44:16
【问题描述】:

我有一些代码可以计算出从今天到给定日期的时间,这个日期是用户从日期选择器中选择的日期。

我将在下面发布代码,但首先是我的问题。我有一个标签,它会根据所选日期之前的月份、日期、小时数等进行更新。但是,当它下降到所选日期的前一天时,它会变得很奇怪。

我会假设(可能是错误的)并希望它倒计时到午夜,所以一旦选定的日期,我将我的标签更改为我喜欢的任何内容。相反,它表示距离所选日期的午夜还有 4 小时左右还有 24 小时。

我只想让它倒计时到午夜。

systemCalendar = [NSCalendar currentCalendar];
    unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit;
    components = [systemCalendar components:unitFlags
                                   fromDate:[NSDate date]
                                     toDate:[[NSUserDefaults standardUserDefaults] objectForKey:@"dateSaved"]
                                    options:0];

if (![[NSUserDefaults standardUserDefaults] objectForKey:@"dateSaved"]) 
    {
        dateLbl.text = @"You haven't chosen a date yet.";
    }
    else
    {
        //Plural string variations
        NSString *seconds = @"Seconds";
        NSString *minutes = @"Minutes";
        NSString *hours = @"Hours";
        NSString *days = @"Days";
        NSString *months = @"Months";
        NSString *years = @"Years";

        //No time left until wedding day
        if ([components year] <= 0 && [components month] <= 0 && [components day] <= 0 && [components hour] <= 0 && [components minute] <= 0 && [components second] <= 0)
        {
            dateLbl.text = @"It's Your Day!";
        }
        //Hours left until day
        else if ([components year] <= 0 && [components month] <= 0 && [components day] <= 0 && ([components hour] > 0 || [components minute] > 0 || [components second] > 0))
        {
            if ([components hour] > 1) hours = @"Hours";
            else hours = @"Hour";

            if ([components minute] > 1) minutes = @"Minutes";
            else minutes = @"Minute";

            if ([components second] > 1) seconds = @"Seconds";
            else seconds = @"Second";

            dateLbl.text = [NSString stringWithFormat:@"%i %@, %i %@, %i %@ Until Your Day", [components hour], hours, [components minute], minutes, [components second], seconds];
            //dateLbl.text = @"Tomorrow is your day!";
        }
        //Days left until day
        else if ([components year] <= 0 && [components month] <= 0 && [components day] > 0)
        {
            if ([components day] > 1) days = @"Days";
            else days = @"Day";

            dateLbl.text = [NSString stringWithFormat:@"%i %@ Until Your Day", [components day], days];
        }
        //Months left until day
        else if ([components year] <= 0 && [components month] > 0)
        {
            if ([components month] > 1) months = @"Months";
            else months = @"Month";

            if ([components day] > 1) days = @"Days";
            else days = @"Day";

            dateLbl.text = [NSString stringWithFormat:@"%i %@, %i %@ Until Your Day", [components month], months, [components day], days];
        }
        //Years left until day
        else if ([components year] > 0)
        {
            if ([components year] > 1) years = @"Years";
            else years = @"Year";

            if ([components month] > 1) months = @"Months";
            else months = @"Month";

            if ([components day] > 1) days = @"Days";
            else days = @"Day";

            dateLbl.text = [NSString stringWithFormat:@"%i %@, %i %@, %i %@ Until Your Day", [components year], years, [components month], months, [components day], days];
        }
    }

【问题讨论】:

  • 你能详细说明一下这个行为吗?它在前一天之前是否正常运行,最后一天你看到了什么?
  • 例如,可能是最后一天晚上 8 点,它会显示还剩 22 小时或超过应有的时间。无论如何,我发现这是因为日期选择器没有给出带有午夜的日期,而是给出了其他一些小时值,所以在保存日期时我将小时部分设置为午夜。
  • 酷。也许您可以详细说明您的解决方案并接受它=)
  • 可以,不过两天接受不了!

标签: iphone objective-c ipad time nsdate


【解决方案1】:

原来我需要将日期的小时、分钟和秒重置为 0,这样我保存它时日期就在午夜。

所以当我从我的日期选择器中保存日期时,我会这样做:

NSDateComponents *components = [[NSCalendar currentCalendar] components:NSIntegerMax fromDate:[datePicker date]];
    //Reset date components
    [components setHour:0];
    [components setMinute:0];
    [components setSecond:0];
    //Create new date with components reset for midnight of selected day
    NSDate *midnight = [[NSCalendar currentCalendar] dateFromComponents:components];

所以现在我选择了日期,并将小时、分钟和秒设置为午夜,因此倒计时运行到正确的时间。

在这里找到了解决方案:

How to retrieve number of hours past midnight from an NSDate object?

【讨论】:

    【解决方案2】:

    Keith Lazuka 提供了几乎相同的解决方案:

    NSDateAdditions.hNSDateAdditions.m

    但它还包含其他有用的方法:

    - (NSDate *)cc_dateByMovingToBeginningOfDay;
    - (NSDate *)cc_dateByMovingToEndOfDay;
    - (NSDate *)cc_dateByMovingToFirstDayOfTheMonth;
    - (NSDate *)cc_dateByMovingToFirstDayOfThePreviousMonth;
    - (NSDate *)cc_dateByMovingToFirstDayOfTheFollowingMonth;
    - (NSDateComponents *)cc_componentsForMonthDayAndYear;
    - (NSUInteger)cc_weekday;
    - (NSUInteger)cc_numberOfDaysInMonth;
    

    【讨论】:

      猜你喜欢
      • 2014-05-29
      • 2020-02-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-13
      • 1970-01-01
      • 1970-01-01
      • 2012-08-02
      相关资源
      最近更新 更多