跳出NSDate
感觉任何语言关于时间的格式化处理,时区的处理都是多的,最近被NSDate的各种问题坑了好久
先看看关于NSDate自己的问题
1.NSDate
NSDate获取当前时间
NSDate *date=[NSDate date];
[NSDate date],输出是GMT时间(GMT(Greenwich Mean Time)代表格林尼治标准时间),如果想获取当前时间需要通过时间戳进行转换
+(NSDate *)GetLocalTimeNow:(NSDate *)date{
NSTimeZone *timezone=[NSTimeZone systemTimeZone];
NSInteger interval=[timezone secondsFromGMTForDate:date];
NSDate *localdate=[date dateByAddingTimeInterval:interval];
return localdate;
}
初步看起来是没有问题了,第一步获取当前时区,第二步计算当前时区和GMT时区的差值,第三步通过时区差将时间增加差值获取当前时间
输出当前时间是
"2014-12-16 10:20:58 +0000"
看后面的+0000是不是感觉有不对了,假如当前时区是beijing,那么时间是不对的了,应该是+0800,这里我绕了个圈子,其实我们用[NSDate date]获得的就是当前时间,只不过是GMT的时间,如果我们加自己时区的间隔只不过是把GMT时间添加了8个小时而已,其实相对我们来说吧GMT时间加8小时输出,换算为我们本地时间的话也会增加8个小时,下面我们用NSString输出试一下看看
2.NSDate与NSString的转换
苹果用NSDateFormatter进行NSDate和NSString之间的转换,HH代表24小时制,hh代表12小时制
+(NSString *)MakedatetoStr:(NSDate *)date{
NSDateFormatter *datef=[[NSDateFormatter alloc]init];
[datef setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
NSString *datestr=[datef stringFromDate:date];
return datestr;
}
这次我们输入[NSDate date]的时间,看看输出是不是当前时间
动手试一下,可以看到
2014-12-16 10:20:58
上下代码是一起运行的,所以可以看出,如果我们使用格式化字符串的默认输出就是本地时间,是不需要进行时间戳换算的,如果需要时间转换,只需设置时区就好了
比如
增加一行国外的时区
[datef setTimeZone:[NSTimeZone timeZoneWithName: @"America/Adak"]];
locatime:2014-12-16 11:31:38
GMT : 2014-12-16 03:31:38
America :2014-12-15 17:31:38
但是我想输出时区怎么办呢,如果换了格式怎么办呢,我需要找出苹果的格式化字符串说明文档,通过帮助文档居然找到了苹果的ISO文档

根据zone格式化字符说明只需增加一个大“Z”即可,年月日小时分秒 时区均是分开的格式化字符串,所以你可以随便排列他们的顺序
即
+(NSString *)MakedatetoStr:(NSDate *)date{
NSDateFormatter *datef=[[NSDateFormatter alloc]init];
NSDateFormatter *datef2=[[NSDateFormatter alloc]init];
[datef2 setDateFormat:@"yyyy-MM-dd HH:mm:ss Z"];
[datef setDateFormat:@"Z yyyy-MM-dd HH:mm:ss}"];
[datef setTimeZone:[NSTimeZone timeZoneWithName: @"America/Adak"]];
NSString *datestr=[datef stringFromDate:date];
NSLog(@"locatime%@,GMT:%@,America:%@",[datef2 stringFromDate:date],date,datestr);
return datestr;
}
locatime2014-12-16 13:41:17 +0800
,GMT:2014-12-16 05:41:17 +0000,
America:-1000 2014-12-15 19:41:17
这样我们也就能进行反方向的转换了
+(NSDate *)GetLocalTimeNowFromstr:(NSString *)dateString{
NSDateFormatter *datef=[[NSDateFormatter alloc]init];
[datef setDateFormat:@"yyyy-MM-dd HH:mm:ss Z"];
NSDate *date=[datef dateFromString:dateString];
return date;
}
输入
2014-12-16 13:41:17 +0800
输出
2014-12-16 05:41:17 +0000
瞧又回到我们一开的GMT时区了
总结一下,其实我们在获得时间的时候完全不需要在进行时区转换,所有的地方按GMT时区来作为时间记录,想用的时候做一下时区转好就好了,本地时区的转换又非常的方便
3.NSDate转.net Json格式时间
通过上一篇介绍,.net格式化Json后的时间格式是/Date(xxxxxxxxxxxxx+xxxx)/,我试过无法通过AFNetwork直接按时间传入,那么只能格式化字符串了
第一步获取时间和1970的时间间隔,返回时秒需要换成毫秒,即*1000,但是还会多两位,使用格式化字符串“%0.0lf”来取消小数点
第二步获取时区数字 获得当前的时区,返回当前时区和标准时区的时间戳,单位是秒,需要×100抵消小数点,因为需要的是4位数,需要用零填充%04ld表示不满足4位用0填充
第三步 获取时间,拼接字符串,这个大家都会吧。。
+(NSString *)MakeJsonDate:(NSDate *)date{
NSTimeInterval interval=[date timeIntervalSince1970]*1000;
NSString *datestr=[[NSString alloc]initWithFormat:@"%0.0lf",interval];
NSTimeZone *zone=[NSTimeZone systemTimeZone];
NSInteger zoneinterval=[zone secondsFromGMT];
NSInteger zonenum=zoneinterval/60/60*100;
NSString *json=[[NSString alloc]initWithFormat:@"/Date(%@+%04ld)/",datestr,zonenum];
return json;
}
至此终于解决这个头疼的问题了
以后还是用字符串来传递时间吧。。。。
跳出NSDate的更多相关文章
- 有关“数据统计”的一些概念 -- PV UV VV IP跳出率等
有关"数据统计"的一些概念 -- PV UV VV IP跳出率等 版权声明:本文为博主原创文章,未经博主允许不得转载. 此文是本人工作中碰到的,随时记下来的零散概念,特此整理一下. ...
- java跳出多重嵌套循环
public class BreaklFor { public static void main(String args[]){ OK: //设置一个标记 使用带此标记的break语句跳出多重循环体 ...
- iOS NSDate等时间类的使用
一.NSDate NSDate对象用来表示一个具体的时间点. NSDate是一个类簇,我们所使用的NSDate对象,都是NSDate的私有子类的实体. NSDate存储的是GMT时间,使用的时候会根据 ...
- Foundation框架下的常用类:NSNumber、NSDate、NSCalendar、NSDateFormatter、NSNull、NSKeyedArchiver
========================== Foundation框架下的常用类 ========================== 一.[NSNumber] [注]像int.float.c ...
- 【原】iOS学习之NSDate在项目中的一些类目扩展
在项目中,我们可能会面对各种各样的对于时间的需求,在这里提供几种可能会用到的需求代码 1.与今天的时间做比较,返回日期差值 代码: - (NSInteger)compareWithToday { NS ...
- $.each ---- 跳出当前的循环
有些朋友可能会以为在jquery跳出循环可以直接使用continue和break了,但是使用之后没有效果,因为在jquery中没有这两条命令.后来上网查了下,得到了结果:return false;—— ...
- ASP.Net MVC Action重定向跳出Controller和Area
1.重定向方法简介 [HttpPost] public ActionResult StudentList( string StudName, string studName, DateTime Bir ...
- 时间戳转化为日期TimeStamp转NSDate转NSString
//时间戳处理 NSInteger time = [self.album.updatedAt integerValue] / 1000; NSNumber *timer = [NSNumber num ...
- java如何跳出多重嵌套循环
Java里的break能跳出循环但是只能跳出一个,goto这个在java中也只是被当作关键是,没有任何作用 要做到跳出多重嵌套循环,可以用此方法 在循环体开头设置一个标志位,设置一个标记,然后使用带此 ...
随机推荐
- 点滴积累【JS】---JS小功能(JS实现排序)
效果: 思路: 首先,获得用到的ID,在把得到的<li>数组添加到array数组里面,然后在进行array排序,排序完后再将array中的数据用appendChild添加到ul里面: 代码 ...
- Atitit.h5 web webview性能提升解决方案-----fileStrore缓存离线存储+http方案
Atitit.h5 web webview性能提升解决方案-----fileStrore缓存离线存储+http方案 1. 业务场景 android+webview h5 css背景图性能提升1 2. ...
- python3 解析xml
转载:http://www.jb51.net/article/79494.htm 这篇文章主要为大家详细介绍了深入解读Python解析XML的几种方式,以ElementTree模块为例,演示具体使用方 ...
- 查看selinux的状态
sh-4.1# getenforce Disabled sh-4.1# getenforce Disabled 永久方法 – 需要重启服务器 修改/etc/selinux/config文件中设置SEL ...
- hdoj 1053 Entropy(用哈夫曼编码)优先队列
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1053 讲解: 题意:给定一个字符串,根据哈夫曼编码求出最短长度,并求出比值. 思路:就是哈夫曼编码.把 ...
- Macbook小问题
Macbook小问题 有时候 AppStore 和 Safari,QQ等 无法上网,但 chrome 却是正常的.解决办法:终端输入如下命令,其实是在 kill 掉网卡进程. sudo killall ...
- PHP学习笔记(6)js点击刷新验证码
用“换一张”来控制验证码刷新,js脚本怎么写 宏朋雄 | 浏览 3663 次 2012-06-11 22:41 2012-06-12 01:49 最佳答案 <img src=“验证码文 ...
- SQLi-Labs学习笔记
结构化查询语言,也叫做SQL,从根本上说是一种处理数据库的编程语言.对于初学者,数据库仅仅是在客户端和服务端进行数据存储.SQL通过结构化查询,关系,面向对象编程等等来管理数据库.编程极客们总是搞出许 ...
- 在一个验证form的实例中扩展jQuery.validate
需求很简单,直接上图: 要验证表单上的3个input输入框的格式,要求如下: 主关键词情形1: 浙江 杭州 温州 主关键词情形2: 浙江|江苏|上海,但是不能用 空格和 | 混合用,也就是情形1和2不 ...
- FAT,FAT32,NTFS单目录文件数量限制
http://hi.baidu.com/huaxinchang/item/5ba53ba9b29631756dd4551b —————————————————————————————————————— ...