• ios开发-日期处理(类似朋友圈,微博等的发送时间)


    ios开发中,我们经常要处理从服务器获取的时间。类似朋友圈,微博这些应用。我们经常可以看到“刚刚”,“31分钟前发表”,“昨天5点”,之类的字样。

    当时我们从服务器端获取的都是那条朋友圈信息,或者微博的创建时间。所以我们每次显示数据的时候,都需要根据跟当前的时间做对比,按照格式,算出

    我们想要的结果。

    例如,我们从服务器获取的时间,大概都类似于  Sun May 24 12:12:00 +0800 2015 

    我们还是先详细说明一下日期格式

      • y 将年份 (0-9) 显示为不带前导零的数字
      • yy 以带前导零的两位数字格式显示年份
      • yyy 以四位数字格式显示年份
      • yyyy 以四位数字格式显示年份
      • M 将月份显示为不带前导零的数字(如一月表示为 1)
      • MM 将月份显示为带前导零的数字(例如 01/12/01)
      • MMM 将月份显示为缩写形式(例如 Jan)
      • MMMM 将月份显示为完整月份名(例如 January)
        • 一月 Jan January
        • 二月 Feb February
        • 三月 Mar March
        • 四月 Apr April
        • 五月 May May
        • 六月 Jun June
        • 七月 Jul July
        • 八月 Aug August
        • 九月 Sep September
        • 十月 Oct October
        • 十一月 Nov November
        • 十二月 Dec December
      • d 将日显示为不带前导零的数字(如 1)
      • dd 将日显示为带前导零的数字(如 01)
    • 星期
      • EEE 将日显示为缩写形式(例如 Sun)
      • EEEE 将日显示为全名(例如 Sunday)
        • 星期一 Mon Monday
        • 星期二 Tue Tuesday
        • 星期三 Wed Wednesday
        • 星期四 Thu Thursday
        • 星期五 Fri Friday
        • 星期六 Sat Saturday
        • 星期天 Sun Sunday
    • 小时
      • h 使用 12 小时制将小时显示为不带前导零的数字(例如 1:15:15 PM)
      • hh 使用 12 小时制将小时显示为带前导零的数字(例如 01:15:15 PM)
      • H 使用 24 小时制将小时显示为不带前导零的数字(例如 1:15:15)
      • HH 使用 24 小时制将小时显示为带前导零的数字(例如 01:15:15)
    • 分钟
      • m 将分钟显示为不带前导零的数字(例如 12:1:15)
      • mm 将分钟显示为带前导零的数字(例如 12:01:15)
      • s 将秒显示为不带前导零的数字(例如 12:15:5)
      • ss 将秒显示为带前导零的数字(例如 12:15:05)
      • f 显示秒的小数部分
      • ff 将精确显示到百分之一秒
      • ffff 将精确显示到万分之一秒
      • 用户定义格式中最多可使用七个 f 符号
    • 上午&下午
      • t 使用 12 小时制
        • 中午之前任一小时显示大写的 A
        • 中午到 11:59 PM 之间的任一小时显示大写的 P
      • tt 对于使用 12 小时制的区域设置
        • 中午之前任一小时显示大写的 AM
        • 中午到 11:59 PM 之间的任一小时显示大写的 PM
      • 对于使用 24 小时制的区域设置,不显示任何字符
    • 时区
      • z 显示不带前导零的时区偏移量
      • zz 显示带前导零的时区偏移量(例如 -08)
      • zzz 显示完整的时区偏移量(例如 -0800)
    • 纪元
      • gg 显示时代/纪元字符串(例如 A.D.)

    理解完上面的知识之后,我们就可以写代码了。预先制定一下需求吧

        刚刚(一分钟内)

        X分钟前(一小时内)

        X小时前(当天)

        昨天 HH:mm(昨天)

        MM-dd(当年)

        yyyy-MM-dd HH:mm(更早期)

    第一步:我们一个日期NSDate的分类,然后先写一个类方法,将从服务器的时间数据转成NSDate(代码继续用swift练练)

    我们先按照“ Sun May 24 12:12:00 +0800 2015”这个格式举例

     1 ///使日期字符串 创建NSDate
     2     class func createDate(fullDateString:String)->NSDate?{
     3        
     4         //创建fomater
     5         let ft = NSDateFormatter()
     6         //设置本地化
     7         // 2. 要指定日期的地区,Xcode 6.3 beta 还不需要,地区需要指定英语
     8         // 注意:在真机调试的时候,一定要指定区域,否则以前版本同样无法转换
     9         ft.locale = NSLocale(localeIdentifier: "en")
    10         
    11         //设置日期格式
    12         ft.dateFormat = "EEE MMM dd HH:mm:ss zzz yyyy"
    13        
    14         //生成日期
    15         return ft.dateFromString(fullDateString)
    16     }

    第二步:再在NSDate分类中创建对象方法(函数),正式处理时间, 里面要用到NSCalendar类(日历)

    func fullDescription()->String{
            
            //用日历类获得当前的日期
            let calendar = NSCalendar.currentCalendar()
            
            //创建datefomater
            let ft = NSDateFormatter()
            
            //当天
            if calendar.isDateInToday(self){
                //获取日期与当前时间的差值
                let delta = Int(NSDate().timeIntervalSinceDate(self))
                if delta < 60 {
                    return "刚刚"
                }
                
                if delta < 3600{
                   return "(delta/60)分钟前"
                }
                return "(delta/3600)小时前"
            }
            
            //昨天
            if calendar.isDateInYesterday(self){
               ft.dateFormat = "昨天 HH:mm"
               return ft.stringFromDate(self)
            }
            
            //计算年度差值
            let coms = calendar.components(NSCalendarUnit.CalendarUnitYear, fromDate: NSDate(), toDate: self, options: NSCalendarOptions(0))
            
            //今年
            if coms.year == 0 {
               ft.dateFormat = "MM-dd"
               return ft.stringFromDate(self)
            }
            
            //剩下的都是往年了
            ft.dateFormat = "yyyy-MM-dd HH:mm"
            return ft.stringFromDate(self)
        }

    第三步:上面两个方法都写完之后,每次只要调用即可获得想要的数据了

     想要的数据 = NSDate.createDate("服务器记录的创建时间").fullDescription()

  • 相关阅读:
    CRL线程池调度和配置的一些细节
    迁移到iis7
    musicstore edit方法出错的原因和解决方法
    如何分离出EF的三份结构定义文件
    在GridView中 鼠标移动到行 该行颜色变换
    飘逸程序员的老家
    [转贴]ASP.NET中常用的26个优化性能方案
    【转贴】在ASP.NET中显示进度条ASP.NET
    在使用GridView中删除的按钮弹出提示框最简单的一中方法
    【转贴】ASP.NET图表控件
  • 原文地址:https://www.cnblogs.com/haojuncong/p/4537411.html
Copyright © 2020-2023  润新知