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”这个格式举例

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

第二步:再在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 < {
return "刚刚"
} if delta < {
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()) //今年
if coms.year == {
ft.dateFormat = "MM-dd"
return ft.stringFromDate(self)
} //剩下的都是往年了
ft.dateFormat = "yyyy-MM-dd HH:mm"
return ft.stringFromDate(self)
}

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

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

ios开发-日期处理(类似朋友圈,微博等的发送时间)的更多相关文章

  1. Masonry 布局 cell 高度适应的一种方案(实现类似朋友圈简单布局)

    来源:伯乐在线 - 夏天然后 链接:http://ios.jobbole.com/89298/ 点击 → 申请加入伯乐在线专栏作者 前言: 我模仿的是微博的布局所以也就没有 评论动态刷新cell. 1 ...

  2. 李洪强iOS开发本人集成环信的经验总结_06_发送好友请求

    李洪强iOS开发本人集成环信的经验总结_06_发送好友请求 同步好友请求 异步好友请求

  3. 周记6——css实现类似朋友圈九宫格缩略图完美展示

    公司有在做一个类似qq空间的开发,发表说说避免不了的要有图片展示. 产品提出的空间缩略图的展示类似*信朋友圈那种效果--图片不变形.能看到中间部分. 这里给出3种解决方案(jsbin地址失效时可复制代 ...

  4. iOS 类似朋友圈的图片浏览器SDPhotoBrowser

    SDPhotoBrowser.Demo 1.在文件SDBrowserImageView.m中有用SDWebImage到网络加载图片 需要的注释去掉即可 #import "ViewContro ...

  5. iOS开发日期处理

    Foundation框架之 日期与时间 #import"ViewController.h"@interfaceViewController() { NSTimer*_timer;/ ...

  6. IOS开发学习笔记031-代码实现微博界面

    微博界面如下 1.准备资源文件 新建一个plist文件,添加条目,root类型是array,子类型是Dictionary 2.更改父类,实现代理方法 接下来得实现过程如上一篇文章,改变父类为UITab ...

  7. ios开发日期的NSDate,NSCalendar分类

    #import <Foundation/Foundation.h> @interface NSDate (XMGExtension) /** */ // @property (nonato ...

  8. Android开发 sharesdk分享微信/朋友圈的时候只显示文字,不显示链接

    问题:分享的时候只将分享的content分享出去了,连标题及链接都没有分享出去. 原因:没有配置image导致. 解决办法: 在  showShare 方法里面添加配置: if(ImageUrlOrP ...

  9. iOS开发:后台运行以及保持程序在后台长时间运行

    第一部分 1.先说说iOS 应用程序5个状态: 停止运行-应用程序已经终止,或者还未启动. 不活动-应用程序处于前台但不再接收事件(例如,用户在app处于活动时锁住了设备). 活动-app处于“使用中 ...

随机推荐

  1. Android中文API (110) —— CursorTreeAdapter

    前言 本章内容是android.widget.CursorTreeAdapter,版本为Android 3.0 r1,翻译来自"深夜未眠",欢迎访问它的博客:"http: ...

  2. 多线程 Synchronized关键字和Lock

    Synchronized  分为实例锁和全局锁. 实例锁为 synchronized(this) 和 非static synchronized方法.   也加对象锁. 只要一个线程访问这类的一个syn ...

  3. 用SpringBoot搭建简单电商项目 01

    前几节呢,我们已经简单介绍了SpringBoot框架的使用,从这一节开始,我们尝试着使用SpringBoot框架来一步一步搭建一个简单电商项目.当然了,这不是真正的电商项目,你可以看成是一个CRUD案 ...

  4. 一个非常标准的连接Mysql数据库的示例代码

    一.About Mysql 1.Mysql 优点 体积小.速度快.开放源码.免费 一般中小型网站的开发都选择 MySQL ,最流行的关系型数据库 LAMP / LNMP Linux作为操作系统 Apa ...

  5. 在Winform混合式框架中整合外部API接口的调用

    在我们常规的业务处理中,一般内部处理的接口多数都是以数据库相关的,基于混合式开发的Winform开发框架,虽然在客户端调用的时候,一般选择也是基于Web API的调用,不过后端我们可能不仅仅是针对我们 ...

  6. C语言嵌套循环作业

    一.PTA实验作业 题目1:7-4 换硬币 1. 本题PTA提交列表 2. 设计思路 1.定义fen5:5分硬币数量, fen2:2分硬币数量, fen1:1分硬币数量, total:硬币总数量,co ...

  7. Exception in thread "main" expected '<document start>', but found BlockMappingStart in 'reader', line 23, column 2: nimbus.host: "master"

    平台:centos-6.3-i386 jdk-7u51 storm 0.9.1 python 2.6.6   hadoop 1.2.1 启动storm的时候,遇到这个问题,百度之后,看到大家的解决方案 ...

  8. Scala 对象

    1. 单例对象 对于任何你在Java中会使用单例对象的地方, 在scala中都可以使用对象来实现; scala字段没有静态方法或者静态字段, 可以使用object语法结构达到同样的效果,对象(obje ...

  9. Jenkins中展示HTML测试报告

    背景:测试报告是用reportNG生成的,属于java自动化测试项目. 1)         安装插件 首先要安装HTML Publisher plugin,这个在插件管理里面搜索并安装即可,如下我已 ...

  10. python 单例模式的四种创建方式

    单例模式 单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在.当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场. ...