首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将当前时间集合为最近的30分钟间隔Obj c

将当前时间集合为最近的30分钟间隔Obj c
EN

Stack Overflow用户
提问于 2014-12-22 13:51:12
回答 3查看 1.3K关注 0票数 2

我的选择设置:

  • 时间模式
  • 30分钟间隔
  • 当前时间
  • 在按钮操作后获取选择器值(下面的代码): //开始时间if( date_formate ) date_formate=nil;date_formate=[NSDateFormatter alloc init];date_formate setDateFormat:@"hh:mm a";txtfldBeginTime.text=date_formate stringFromDate:time_picker.date;

问题:

  • 目前时间是下午6:17。
  • 选择程序从下午6:00开始显示。
  • 在选择器中不带任何滚动的情况下获取选择器值时。下午6点17分返回。
  • 在选择器中使用某些滚动获取选择器值,并设置其启动时间(下午6:00)。然后,它返回正常的下午6:00。

提议:

1.

  • 如果当前时间是5:30以上,低于6:00意味着,则从6:00开始选择。
  • 否则,当前时间在6:00以上,低于6:30,则选择者从6:30开始。

代码语言:javascript
运行
复制
1. when get the picker value without any scroll, the return value should be initial value of picker. That is, if the picker starts from 6:30 means then the picker return value be 6:30.

EN

回答 3

Stack Overflow用户

发布于 2014-12-22 14:42:16

这是最接近30分钟的公式。

代码语言:javascript
运行
复制
int remainder = currentMinute % 30;
int rounded = currentMinute + 30-remainder;

// if current minute is 17
// remainder = 17 % 30 == 17
// rounded = 17 + 30-17 == 30

// if current minute is 56
// remainder = 56 % 30 == 26
// rounded = 56+30-26== 60

编辑:将模运算符从\更正为%

EDIT2:对不起,我之前发布的公式是不正确的。这应该是正确的答案

编辑3:完整代码

代码语言:javascript
运行
复制
- (NSDate *)roundUpToNearestHalfHour:(NSDate *)value {
    NSDateComponents *comp = [[NSCalendar currentCalendar] components:NSCalendarUnitYear|NSCalendarUnitMonth|NSCalendarUnitDay|NSCalendarUnitHour|NSCalendarUnitMinute|NSCalendarUnitCalendar fromDate:value];
    NSInteger minute = [comp minute];
    int remainder = minute % 30;
    int rounded = minute + 30 - remainder;

    [comp setMinute:rounded];

    return [comp date];
}
票数 6
EN

Stack Overflow用户

发布于 2016-04-16 22:02:43

我就这样解决了

代码语言:javascript
运行
复制
 - (void)viewDidLoad {
    [super viewDidLoad];

    UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(hideKeyboard)];
    tapGesture.cancelsTouchesInView = NO;
    [self.view addGestureRecognizer:tapGesture];

    DoneCancelNumberPadToolbar *toolbar = [[DoneCancelNumberPadToolbar alloc] initWithTextField:self.startTime];
    toolbar.delegateLocal = self;
    self.startTime.inputAccessoryView = toolbar;
    self.endTime.inputAccessoryView = toolbar;

    self.pickerStartTime = [[UIDatePicker alloc] init];
    self.pickerStartTime.datePickerMode = UIDatePickerModeTime;
    [self.pickerStartTime setLocale:[NSLocale localeWithLocaleIdentifier:@"pt_BR"]];
    [self.pickerStartTime setMinuteInterval:30];
    [self.pickerStartTime addTarget:self action:@selector(dateStartIsChanged) forControlEvents:UIControlEventValueChanged];

    self.startTime.inputView = self.pickerStartTime;
}

- (void) dateStartIsChanged {
    NSDateComponents *comp = [[NSCalendar currentCalendar] components:NSCalendarUnitYear|NSCalendarUnitMonth|NSCalendarUnitDay|NSCalendarUnitHour|NSCalendarUnitMinute|NSCalendarUnitCalendar fromDate:self.pickerStartTime.date];

    NSDateFormatter *outputFormatter = [[NSDateFormatter alloc] init];
    [outputFormatter setDateFormat:@"H:mm"];

    self.startTime.text = [outputFormatter stringFromDate:[comp date]];
}

票数 2
EN

Stack Overflow用户

发布于 2019-07-29 15:34:43

对于那些寻找类似@Tien的答案,但在Swift (斯威夫特4)。

代码语言:javascript
运行
复制
func roundUpToNearestQuarterHour(date: Date) -> Date{


    var comp = Calendar.current.dateComponents(in: TimeZone.current, from: date)

    let minute = comp.minute
    let remainder = minute % 30;
    let rounded = minute + 30 - remainder;

    comp.setValue(rounded, for: .minute)

    return comp.date

}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27604035

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档