OC--Foundation--字符串+日期和时间


前言

一点点拓展
开始介绍Foundation之前我们先来了解一下Cocoa

什么是Cocoa呢?Cocoa是OS
X和iOS操作系统的程序的运行环境。Cocoa由对象组成,而这些对象都继承自NSObject类。并且他们都是基于OC运行环境。

Cocoa

iOS中,Cocoa的框架中最重要最基本的两个框架是Foundation和UIkit,和界面无关的基本类的属于Foundation框架,uikit框架是和界面相关的。

Foundation框架

将Foundation框架中的类进行逻辑分类可以分为一下几类:值对象、集合、操作系统服务(文件系统、URL、进程通信、线程和子任务)、通知、归档和序列化、表达式和条件判断、Objective-C语言服务。


提示:以下是本篇文章正文内容,下面案例可供参考

一、字符串

1.字符串是什么?

字符串就是一连串的字符序列,OC中有两个字符串,NSString和NSMutableString
NSString代表字符序列不可变的字符串
NSMutableString代表字符序列可变的字符串

2.如何创建字符串?

NSString的功能如下:
在这里插入图片描述

3.创建NSString对象的几种方式

这里的unichar就是unsigned short的别名

#import<Foundation/Foundation.h>
int main(int argc,char* argv[]){
    @autoreleasepool {
        unichar data[6]={1,2,3,4,5,6};
        //初始化字符串
        NSString* str=[[NSString alloc]
                       initWithCharacters:data length:6];
        NSLog(@"%@",str);
        char* cstr = "hello";
        //将C风格的字符串转换成OC风格
        NSString* str2=[NSString stringWithUTF8String:cstr];
        NSLog(@"%@",str2);
        //将字符串写入指定文件
        [str2 writeToFile:@"myFile.txt"
               atomically:YES
                 encoding:NSUTF8StringEncoding
                    error:nil];
        //读取文件内容,用文件内容初始化字符串
        NSString* str3=[NSString stringWithContentsOfFile:@"NSStringTest.m"
                                                 encoding:NSUTF8StringEncoding
                                                    error:nil];
        NSLog(@"%@",str3);
    }
}

这里是代码运行结果
在这里插入图片描述

4.NSString的常用功能

此处介绍了NSString类的用法

#import<Foundation/Foundation.h>
int main(int argc,char*argv[]){
    @autoreleasepool {
        NSString* str=@"magic";
        NSString* person=@"娜娜";
        str = [str stringByAppendingString:@",nuonuo"];
        NSLog(@"%@", str);
        const char* cstr = [str UTF8String];
        NSLog(@"获取的C字符串:%s",cstr);
        str = [str stringByAppendingFormat:@"%@是一个很好的人",person];
        NSLog(@"%@",str);
        NSLog(@"str字符个数为:%lu",[str length]);
        NSLog(@"str按照UTF—8字符集解码后的字节数为:%lu",[str lengthOfBytesUsingEncoding:NSUTF8StringEncoding]);
        NSString* s1=[str substringToIndex:10];
        NSLog(@"%@",s1);
        NSString* s2=[str substringFromIndex:5];
        NSLog(@"%@",s2);
        NSString* s3=[str substringWithRange:NSMakeRange(5, 15)];
        NSLog(@"%@",s3);
        NSRange pos=[str rangeOfString:@"uo"];
        NSLog(@"uo在str中出现的开始位置:%ld,长度为:%ld",pos.location,pos.length);
        str = [str uppercaseString];
        NSLog(@"%@",str);
    }
}

在这里插入图片描述

5.可变字符串(NSMutableString)

NSMutableString代表一个字符序列可变的字符串。
NSMutableString是NSString的子类,所以前面介绍的NSString所包含的所有方法,NSMutableString都可以直接使用

在这里插入图片描述

#import<Foundation/Foundation.h>
int main(int arcg,char* argv[]){
    @autoreleasepool {
        NSString* person=@"神奇海娜";
        NSMutableString* str=[NSMutableString
                              stringWithString:@"hello"];
        //创建一个NSMutableString对象
        [str appendString:@",nuonuo"];
        //追加字符串
        NSLog(@"%@",str);
        //追加带变量的字符串
        [str appendFormat:@"%@是一个非常搞笑的人",person];
        NSLog(@"%@",str);
        //在指定位置插入字符串
        [str insertString:@"magic,"atIndex:6];
        NSLog(@"%@",str);
        //删除从6开始8结束的字符
        [str deleteCharactersInRange:NSMakeRange(6,8)];
        NSLog(@"%@",str);
        //位置从7开始,8结束的所有字符替换成nuonuo
        [str replaceCharactersInRange:NSMakeRange(7,8)
                           withString:@"nuonuo"];
        NSLog(@"%@",str);
    }
}

结果如下
在这里插入图片描述

二、日期和时间

1.日期和时间的创建和初始化

创建NSDate的类方法与实例方法基本相似,只是类方法以date开头,而实例方法以init开头

#import<Foundation/Foundation.h>

int main(int argc, char* argv[])
{
    @autoreleasepool{
        NSDate* date1=[NSDate date];
        NSLog(@"%@",date1);
        NSDate* date2=[[NSDate alloc]initWithTimeIntervalSinceNow:3600*24];
        NSLog(@"%@",date2);
        NSDate* date3=[[NSDate alloc]initWithTimeIntervalSinceNow:-3*3600*24];
        NSLog(@"%@",date3);
        NSDate* date4=[[NSDate alloc]initWithTimeIntervalSince1970:3600*24*365*20];
        NSLog(@"%@",date4);
        NSLocale* cn=[NSLocale currentLocale];
        NSLog(@"%@",[date1 descriptionWithLocale:cn]);
        NSDate* earlier=[date1 earlierDate:date2];
        NSDate* later=[date1 laterDate:date2];
        switch([date1 compare:date3]){
            case NSOrderedAscending:
                NSLog(@"date1位于date3之前");
                break;
            case NSOrderedSame:
                NSLog(@"date1与date3日期相同");
                break;
            case NSOrderedDescending:
                NSLog(@"date1位于date3之后");
                break;
        }
        NSLog(@"date1与date3相差%g秒",[date1 timeIntervalSinceDate:date3]);
        NSLog(@"date2与现在时间相差%g秒",[date2 timeIntervalSinceNow]);
    }
}

结果如下:
在这里插入图片描述

2.日期格式器

  • 日期格式器:NSDateFormatter
  • 功能:完成NSDate与NSString之间的转换
    转换步骤如下:

1.创建一个NSDateFormatter对象
2.调用NSDateFormatter的setDateStyle: ,setTimeStyle:方法设置格式化日期,时间的风格。

在这里插入图片描述

3.如果需要将NSDate转换为NSString,则调用NSDateFromatter的stringFromDate:方法
如果需要将NSString转换成为NSDate,则调用NSDAteFormatter的dateFromString:方法

代码如下:

#import<Foundation/Foundation.h>

int main(int argc, char* argv[])
{
    @autoreleasepool {
        NSDate* dt=[NSDate dateWithTimeIntervalSince1970:300*24*366*20];
        NSLocale* locales[]={
            [[NSLocale alloc]initWithLocaleIdentifier:@"zh_CN"]
            ,[[NSLocale alloc]initWithLocaleIdentifier:@"en_Us"]
        };
        NSDateFormatter* df[8];
        for(int i=0;i<2;i++){
            df[i*4]=[[NSDateFormatter alloc]init];
            [df[i*4] setDateStyle:NSDateFormatterShortStyle];
            [df[i*4] setTimeStyle:NSDateFormatterShortStyle];
            [df[i*4] setLocale:locales[i]];
            df[i*4+1]=[[NSDateFormatter alloc]init];
            [df[i*4+1] setDateStyle:NSDateFormatterMediumStyle];
            [df[i*4+1] setDateStyle:NSDateFormatterMediumStyle];
            [df[i*4+1] setLocale:locales[i]];
            df[i*4+2]=[[NSDateFormatter alloc]init];
            [df[i*4+2] setDateStyle:NSDateFormatterLongStyle];
            [df[i*4+2] setDateStyle:NSDateFormatterLongStyle];
            [df[i*4+2] setLocale:locales[i]];
            df[i*4+3]=[[NSDateFormatter alloc]init];
            [df[i*4+3] setDateStyle:NSDateFormatterLongStyle];
            [df[i*4+3] setDateStyle:NSDateFormatterLongStyle];
            [df[i*4+3] setLocale:locales[i]];
        }
        for(int i=0;i<2;i++){
            switch(i){
                case 0:
                    NSLog(@"  china");
                    break;
                case 1:
                    NSLog(@"  american");
                    break;
            }
            NSLog(@"SHORT格式的日期格式:%@",[df[i*4] stringFromDate:dt]);
            NSLog(@"MEDIUM格式的日期格式:%@",[df[i*4+1] stringFromDate:dt]);
            NSLog(@"LONG格式的日期格式:%@",[df[i*4+2]stringFromDate:dt]);
            NSLog(@"FULL格式的日期格式:%@",[df[i*4+3] stringFromDate:dt]);
        }
        NSDateFormatter* df2=[[NSDateFormatter alloc]init];
        [df2 setDateFormat:@"公元yyyy年mm月dd日hh时xx分"];
        NSLog(@"%@",[df2 stringFromDate:dt]);
        NSString* dateStr=@"2022-5-29";
        NSDateFormatter* df3=[[NSDateFormatter alloc]init];
        [df3 setDateFormat:@"yyyy-mm-dd"];
        NSDate* date2=[df3 dateFromString:dateStr];
        NSLog(@"%@",date2);
    }
}

结果如下:
在这里插入图片描述

3.日历与日期组件

为了能分开处理NSDate对象所包含的各个字段的数据,Foundation框架提供了NSCalendar对象,该对象包含如下两个常用方法

1.(NSDateComponents*)components:fromDate:
从NSDate中提取年,月,日时,分,秒各时间字段的信息
2.dataFromComponents:(NSDateComponents*)comps:
使用comps对象包含的年月日时分秒各时间字段的信息来创建NSDate

NSDateComponents对象用于封装年月日时分秒等各个字段的信息。包含了对各个字段的setter和getter方法

从NSDate对象中获取各时间字段的数值步骤如下:

  • 创建NSCalendar对象
  • 调用NSCalendar的components:fromDate:方法来获取NSDate对象中的各时间字段的数值,该方法返回一个NSDateCoponents对象
  • 调用NSDateComponents对象的getter方法来获取各时间字段的数值

使用各时间字段的数值来初始化NSDate对象的步骤如下

  • 创建NSCalendar对象
  • 创建一个NSDateComponents对象,调用setter方法设置数值
  • NSCalendar的dateFromComponents:(NSDateComponents*)方法初始化NSDate对象
#import<Foundation/Foundation.h>

int main(int argc, char* argv[])
{
    @autoreleasepool {
        NSCalendar* gregorian=[[NSCalendar alloc]
    initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
        NSDate* dt=[NSDate date];
        unsigned unitFlags=NSCalendarUnitYear|
        NSCalendarUnitMonth |NSCalendarUnitDay |
        NSCalendarUnitHour  |NSCalendarUnitMinute|
        NSCalendarUnitSecond |NSCalendarUnitWeekday;
        NSDateComponents* comp=[gregorian components: unitFlags
                                            fromDate:dt];
        NSLog(@"现在是%ld年",comp.year);
        NSLog(@"现在是%ld月",comp.month);
        NSLog(@"现在是%ld日",comp.day);
        NSLog(@"现在是%ld时",comp.hour);
        NSLog(@"现在是%ld分",comp.minute);
        NSLog(@"现在是%ld秒",comp.second);
        NSLog(@"现在是%ld星期",comp.weekday);
        NSDateComponents* comp2=[[NSDateComponents alloc]init];
        comp2.year=2022;
        comp2.month=5;
        comp2.day=29;
        comp2.hour =3;
        comp2.minute=34;
        NSDate* date=[gregorian dateFromComponents:comp2];
        NSLog(@"获取的日期为:%@",date);
        
    }
}

在这里插入图片描述

4.定时器

什么时候会用到定时器?

需要让某个方法重复执行

在这里插入图片描述
定时器接口部分:

#import <Foundation/Foundation.h>

@interface Timer : NSObject {
    NSInteger _index;
    NSTimer* _timer;
}
-(void) startMyTimer;
-(void) stopMyTimer;
-(void)timerAction: (NSTimer*) timer;
@end

类的实现


#import "挪挪.h"
@implementation Timer
- (instancetype)init {
    if (self = [super init]) {
        _index = 1;
        [self startMyTimer];
    }
    return self;
}
 
- (void)startMyTimer {
    _timer = [NSTimer scheduledTimerWithTimeInterval:1.0
            target:self
            selector:@selector(timerAction:)
            userInfo:@"娜娜"
            repeats:YES];
}
 
- (void)stopMyTimer {
    [_timer invalidate];
    NSLog(@"倒计时结束");
}
 
- (void)timerAction:(NSTimer *)timer {
    NSLog(@"%li次",_index);
    _index++;
    NSLog(@"%@",timer.userInfo);
    if (_index > 10) {
        [self stopMyTimer];
    }
}
@end

测试结果:

#import "挪挪.h"

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        Timer* mytimer = [[Timer alloc] init];
        NSRunLoop *loop = [NSRunLoop currentRunLoop];
        [loop run];
    }
    return 0;
}

代码运行结果
在这里插入图片描述

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

山河丘壑

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值