低于或高于最小或最大日期后一天的 UIDatepicker 日期

UIDatepicker date one day earlier after going below or above min or max date

我制作了一个带有完成和取消按钮的自定义 datePickerView。

- (id)initWithCoder:(NSCoder *)aDecoder{
    if (self = [super initWithCoder:aDecoder]) {
    }
    return self;
}

-(void)setupWithMinimumDate:(NSDate *)minimumDate andMaximumDate:(NSDate *)maximumDate andTag:(NSInteger)tag{
    viewToolbar.backgroundColor = [UIColor toolbarBackgroundColor];
    datePicker.datePickerMode = UIDatePickerModeDate;
    datePicker.timeZone = [NSTimeZone localTimeZone];
    datePicker.locale = [NSLocale currentLocale];

    datePicker.minimumDate = minimumDate;
    datePicker.maximumDate = maximumDate;
    tagValue = tag;
}

-(IBAction)doneTapped:(id)sender{
    [self.delegationListener didTapDone:datePicker.date andTag:tagValue];
}

-(IBAction)cancelTapped:(id)sender{
    [self.delegationListener didTapCancel];
}

-(IBAction)datePickerValueChanged:(UIDatePicker *)sender{
    NSLog(@"DATE = %@",sender.date);
    datePicker.date = sender.date;
}

您在 datePickerValueChanged 中看到了 Log 语句。当我保持在最小和最大日期范围内时,它会返回正确的日期。但是当我在我的最小或最大日期上方或下方滚动时,它总是 returns 我的日期比所选日期早一天。

我知道当我用 NSDateFormatter 格式化日期时,它会返回正确的日期字符串。但问题是,我将从我的 datePicker 收到的日期存储在 Realm 对象上。

现在我将领域对象发送到需要使用 UTC 时区进行日期格式化的网络服务器。所以我总是发送一个早一天的日期。

我希望它有点清楚,如果不明白请追问!

当我检查你的代码时你是 NSDate 对象的 NSLog 但是 NSDate 日志不确定 return 正确 NSDate 因为 NSDate returns GMT 时区的当前时间,因此以下是将 GTM 时区与您当地时区进行位计算的代码:

-(IBAction)datePickerValueChanged:(UIDatePicker *)sender{
    NSTimeZone* GTMTimeZone = [NSTimeZone timeZoneWithAbbreviation:@"GMT"];
    NSTimeZone* SystemTimeZone = [NSTimeZone systemTimeZone];

    NSInteger GTMOffset = [GTMTimeZone secondsFromGMTForDate:sender.date];
    NSInteger Systemoffset = [SystemTimeZone secondsFromGMTForDate:sender.date];
    NSTimeInterval interval = Systemoffset - GTMOffset;

    NSDate* correctDate = [[NSDate alloc] initWithTimeInterval:interval sinceDate:sender.date];
    NSLog(@"DATE = %@",correctDate);
    datePicker.date = correctDate;
}

我从 here

参与了我的项目

另一种方法是,您可以将 NSDate 转换为具有正确日期格式的字符串,然后 nslog 它将向您显示正确的日志,如下所示:

-(IBAction)datePickerValueChanged:(UIDatePicker *)sender{

    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
    [formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
    NSLog(@"Todays date is %@",[formatter stringFromDate:sender.date]);

    datePicker.date = sender.date;
}

因此您可以将日期存储为字符串并将其发送到您的后端希望对您有所帮助