【问题标题】:How to format a SQLite date in iPhone?如何在 iPhone 中格式化 SQLite 日期?
【发布时间】:2010-05-10 06:42:04
【问题描述】:

我知道 SQLite 不支持日期名称和月份名称。我已经解决了this 的问题。我为它创建了两个自定义函数。

我的自定义函数,用于从天数转换日期名称:

( %w day of week 0-6 with sunday==0 )

代码:

+(NSString*)dayNameStringFromDayNo:(NSString*)dayNo{
    return 
    ([dayNo isEqualToString:@"0"])?@"Sunday":
    ( ([dayNo isEqualToString:@"1"])?@"Monday":
     ( ([dayNo isEqualToString:@"2"])?@"Tuesday":
      ( ([dayNo isEqualToString:@"3"])?@"Wednesday":
       ( ([dayNo isEqualToString:@"4"])?@"Thursday":
        ( ([dayNo isEqualToString:@"5"])?@"Friday": @"Saturday"
        )
       )
      )
     )
    );
}

我从没有字符串的月份获取月份名称的自定义方法:

( %m month: 01-12 )

代码:

+(NSString*)monthNameFromNumber:(NSString*)no{
    return ([no isEqualToString:@"01"])?@"January":
    ( ([no isEqualToString:@"02"])?@"February":
     ( ([no isEqualToString:@"03"])?@"March":
      ( ([no isEqualToString:@"04"])?@"April":
       ( ([no isEqualToString:@"05"])?@"May":
        ( ([no isEqualToString:@"06"])?@"June":
         ( ([no isEqualToString:@"07"])?@"July":
          ( ([no isEqualToString:@"08"])?@"August":
           ( ([no isEqualToString:@"09"])?@"September":
            ( ([no isEqualToString:@"10"])?@"October":
             ( ([no isEqualToString:@"11"])?@"November":@"Decemeber"
             )
            )
           )              
          )
         )
        )
       )
      )
     )
    );
}

但是日期格式呢

Sat 6th February

如何获得这种输出?我是否必须再次为其创建自定义函数?

【问题讨论】:

    标签: iphone sql datetime sqlite date-format


    【解决方案1】:

    您从 SQLite 获得的日期格式是什么? SQLite 没有原生日期/时间数据类型,但通常将日期存储为 YYYY-MM-DD HH:MM:SS 形式的 ISO8601 字符串或 Unix 样式的时间戳。

    第 1 步:NSDate 的形式获取日期。这是一种方法,使用上面提到的 ISO8601 格式:

    // Create a date formatter
    NSDateFormatter *inputFormatter = [[NSDateFormatter alloc] init];
    [inputFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
    
    // Use the formatter to convert the string you retrieved (from
    // SQLite) into an NSDate.
    NSDate *theDate = [inputFormatter dateFromString:yourSQLiteString];
    
    // Don't forget to release alloc'ed resources
    [inputFormatter release];
    

    如果您的日期存储为 Unix 样式的时间戳,您可以跳过使用输入格式化程序并改用 NSDate dateWithTimeIntervalSince1970:

    第 2 步: 将日期转换为字符串:

    // Create a date formatter for whatever format you want to output,
    // using the formatting patterns from Unicode tr35-6 Appendix F.
    outputFormatter = [[NSDateFormatter alloc] init];
    [outputFormatter setDateFormat:@"EEE d MMMM"];
    NSString *dateString = [dateFormatter stringFromDate:theDate];
    
    // Don't forget to release alloc'ed resources.
    [outputFormatter release];
    

    在此示例中,假设用户使用英语语言环境,您将获得类似 Sat 6 February 的字符串。

    参考资料:

    【讨论】:

    • 嗯。我想你错过了什么。 2 月 6 日星期六 -> 2 月 6 日星期六。同样是 2 月 2 日星期六。
    • 据我所知,你必须自己做。序数(第 6 个而不是 6,第 2 个而不是 2)在口语之间差异很大,并且在大多数编程语言中不直接支持。如果可能,不要指定输出格式,而是允许系统使用其默认输出格式,这将由用户的语言环境决定。
    【解决方案2】:

    为什么不使用formattion capabilities的客户端代码,或者ojective-c不包含strftime?

    【讨论】:

    • 它是否可用于 iPhone 应用程序开发?因为它似乎是 osx 库。
    【解决方案3】:

    好的。我终于为它添加了一些自定义方法。

    +(NSString*)dayNameStringFromDayNo:(NSString*)dayNo{
        return 
        ([dayNo isEqualToString:@"0"])?@"Sunday":
        ( ([dayNo isEqualToString:@"1"])?@"Monday":
         ( ([dayNo isEqualToString:@"2"])?@"Tuesday":
          ( ([dayNo isEqualToString:@"3"])?@"Wednesday":
           ( ([dayNo isEqualToString:@"4"])?@"Thursday":
            ( ([dayNo isEqualToString:@"5"])?@"Friday": @"Saturday"
             )
            )
           )
          )
         );
    }
    
    +(NSString*)dayNameHalfStringFromDayNo:(NSString*)dayNo{
        return 
        ([dayNo isEqualToString:@"0"])?@"Sun":
        ( ([dayNo isEqualToString:@"1"])?@"Mon":
         ( ([dayNo isEqualToString:@"2"])?@"Tues":
          ( ([dayNo isEqualToString:@"3"])?@"Wed":
           ( ([dayNo isEqualToString:@"4"])?@"Thu":
            ( ([dayNo isEqualToString:@"5"])?@"Fri": @"Sat"
             )
            )
           )
          )
         );
    }
    
    +(NSString*)monthNameFromNumber:(NSString*)no{
        return ([no isEqualToString:@"01"])?@"January":
        ( ([no isEqualToString:@"02"])?@"February":
         ( ([no isEqualToString:@"03"])?@"March":
          ( ([no isEqualToString:@"04"])?@"April":
           ( ([no isEqualToString:@"05"])?@"May":
            ( ([no isEqualToString:@"06"])?@"June":
             ( ([no isEqualToString:@"07"])?@"July":
              ( ([no isEqualToString:@"08"])?@"August":
               ( ([no isEqualToString:@"09"])?@"September":
                ( ([no isEqualToString:@"10"])?@"October":
                 ( ([no isEqualToString:@"11"])?@"November":@"Decemeber"
                  )
                 )
                )              
               )
              )
             )
            )
           )
          )
         );
    }
    
    
    +(NSString*)monthNameHalfFromNumber:(NSString*)no{
        return ([no isEqualToString:@"01"])?@"Jan":
        ( ([no isEqualToString:@"02"])?@"Feb":
         ( ([no isEqualToString:@"03"])?@"Mar":
          ( ([no isEqualToString:@"04"])?@"Apr":
           ( ([no isEqualToString:@"05"])?@"May":
            ( ([no isEqualToString:@"06"])?@"Jun":
             ( ([no isEqualToString:@"07"])?@"Jul":
              ( ([no isEqualToString:@"08"])?@"Aug":
               ( ([no isEqualToString:@"09"])?@"Sep":
                ( ([no isEqualToString:@"10"])?@"Oct":
                 ( ([no isEqualToString:@"11"])?@"Nov":@"Dec"
                  )
                 )
                )              
               )
              )
             )
            )
           )
          )
         );
    }
    
    +(NSString*)suffixNameForNumber:(NSString*)no{
        NSInteger noV=[no intValue];
        if(noV>=11 && noV<=20){
            return [no stringByAppendingString:@"th"];
        } else {
            NSString *l=[no substringFromIndex:1];
            if([l isEqualToString:@"1"]){
                return [no stringByAppendingString:@"st"];
            } else if([l isEqualToString:@"2"]){
                return [no stringByAppendingString:@"nd"];
            } else if([l isEqualToString:@"3"]){
                return [no stringByAppendingString:@"rd"];
            } else {
                return [no stringByAppendingString:@"th"];
            }
        }   
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-01
      • 2011-05-10
      • 2011-01-24
      • 1970-01-01
      • 2011-06-04
      • 2011-11-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多