有没有办法在 iOS 中获取分钟和小时的集合/数组?

Posted

技术标签:

【中文标题】有没有办法在 iOS 中获取分钟和小时的集合/数组?【英文标题】:Is there a way to get a Set/Array of minutes and hours in iOS? 【发布时间】:2015-01-19 14:18:30 【问题描述】:

我正在尝试以最简单的方式用分钟和小时填充我的选择器视图。我正在实现一个自定义选择器,因此使用 UIDatePicker 并将其模式设置为 UIDatePickerModeTime 是不可能的。

ios 中是否有可用的函数来检索数据集,或者我只需要使用来自0-12(12 小时制)和0-60 的硬编码值来初始化数组,分别表示小时和分钟,比如 for循环?

我目前正在像这样填充数组:

#pragma mark - Lazy Loading
-(NSArray *)hourValues
    if(!_hourValues)
        NSMutableArray *hours = [[NSMutableArray alloc] init];
        for(int i = 0; i < 12; i++)
            [hours addObject:[NSNumber numberWithInt:i]];
        
        _hourValues = hours;
    
    return _hourValues;

-(NSArray *)minuteValues
    if(!_minuteValues)
        NSMutableArray *minutes = [[NSMutableArray alloc] init];
        for(int i = 0; i < 60; i++)
            [minutes addObject:[NSNumber numberWithInt:i]];
        
        _minuteValues = minutes;
    
    return _minuteValues;

-(NSArray *)amPmValues
    if(!_amPmValues)
        _amPmValues = @[@"am", @"pm"];
    
    return _amPmValues;

我不喜欢硬编码的值。

理想情况下,我希望能够做这样的事情:

hours = [NSDate NS12HourSetArray];
minutes = [NSDate NS60MinuteArray];

【问题讨论】:

也许有NSDateComponents/NSCalendarmaximumRangeOfUnit:,但它仍然会给你60/等。 @Larme 嘿,感谢您的评论。那怎么办呢? 注意:您应该从 1-12 或 0-11 初始化;同样是 0-59 或 1-60。初始化 0-12 和 0-60 会给你太多的分钟和小时。 ;) 反注:这取决于您如何使用比较运算符。 ;) @IanMacDonald 【参考方案1】:

我认为你有 3 个选择:

编写脚本/自动创建文本数据并在运行时加载,您可以在 python/bash 和 plist 中轻松完成。

使用旧的 for 循环手动执行。我建议这样做。

或者您可以分别使用NSIndexSetNSRange 对象从您想要的任何范围创建索引集。

例如:

NSIndexSet *minutesIndexSet = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(0, 60)];

然后,您可以直接从索引集加载 UI,或者再次枚举索引集并用其索引填充数组。

在这两种方式中,您最终要做的是通过循环迭代手动填充您的数组。唯一只做负载的是第一个。

【讨论】:

我明白了,所以没有现成的NSDate/NSDateComponents/NSCalendar 函数可以像[NSCharacterSet alphanumericCharacterSet] 那样为此目的设置一个集合? 我不知道有任何这样的 API,而且我看不出苹果提供的理由,因为大多数数据对象依赖于计算而不是数据集。 就像苹果提供的数据集一样:developer.apple.com/library/mac/documentation/Cocoa/Reference/… 我认为可能有一种方法可以检索date 数据集 字符串和字符在数学上不相关,因此拥有数据集是有意义的,日期在数学上彼此相关,因此拥有它们的集合充其量是懒惰的编程,并且很可能是一种不好的做法。 啊,我明白你所说的数学相关是什么意思。为什么是懒惰的编程?我原以为这更像是一种方便的方法。到目前为止,我一直在遵循第二种方法。谢谢你的意见,我想我会按照另一张海报的建议走类别课程路线,让事情看起来更整洁,更隐蔽。【参考方案2】:

没有可以像这样调用的内置方法。就个人而言,我并没有真正看到硬编码诸如“一小时内的分钟数”之类的问题,因为它定义明确,您可以相对确定它永远不会改变。如果您希望 API 存在,您可以通过在 NSDate 上创建一个类别来稍微隐藏它。

@interface NSDate (ConvenientArrays)
+ (NSArray *)minutesInAnHourArray;
+ (NSArray *)hourRepresentationsPerDay:(BOOL)use24Hour;
@end

@implementation NSDate (ConvenientArrays)
+ (NSArray *)minutesInAnHourArray 
  return @[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9,
           10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
           20, 21, 22, 23, 24, 25, 26, 27, 28, 29,
           30, 31, 32, 33, 34, 35, 36, 37, 38, 39,
           40, 41, 42, 43, 44, 45, 46, 47, 48, 49,
           50, 51, 52, 53, 54, 55, 56, 57, 58, 59];

+ (NSArray *)hourRepresentationsPerDay:(BOOL)use24Hour 
  if (use24Hour) 
    return @[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9,
             10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
             20, 21, 22, 23];
  
  return @[     1,  2,  3,  4,  5,  6,  7,  8,  9,
           10, 11, 12];

@end

【讨论】:

到目前为止,我一直在用 for 循环对其进行硬编码。你是对的,它们定义明确。与类别方法有很好的接触,这种方法让我没有想到,而且肯定会让事情变得更整洁。为了整洁,我将创建一个类别。出于好奇,如果不在 NSDate 类中,您将在哪个类中存在 API。 NSCalenderNSDateComponents 或者在其他班级? 这取决于您的使用情况。如果您将其用于向人类展示,您可以考虑将其放入NSDateFormatter。我以这种方式写了hourRepresentationsPerDay:,以便它返回0-23 24 小时和1-12 12 小时显示。不过,这取决于你。把它放在对你有意义的地方。

以上是关于有没有办法在 iOS 中获取分钟和小时的集合/数组?的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法在 UIDatePicker 中删除小时并添加秒?

有没有办法强制将单个数字Int转换为两位数的int值?

如何获取当前日期(没有小时和分钟)?

在 PHP 中获取小时和分钟

iOS:从 NSDate 获取本地化小时

从 NSDatePicker 获取小时和分钟 - Swift