iOS获取网络时间与转换格式

[NSDate date]可以获取系统时间,但是会造成一个问题,用户可以自己修改手机系统时间,所以有时候需要用网络时间而不用系统时间。获取网络标准时间的方法:

1、先在需要的地方实现下面的代码,创建一个URL并且连接

1 NSURL *url=[NSURL URLWithString:@"http://www.baidu.com"];
2     NSURLRequest *request=[NSURLRequest requestWithURL:url];
3     NSURLConnection *connection=[[NSURLConnection alloc]initWithRequest:request delegate:self startImmediately:YES];
4     [connection start];

2、实现代理方法,接收回应的数据(需要声明<NSURLConnectionDataDelegate>)

/**
 *  代理方法
 */
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{
//      NSLog(@"response--%@",response);
        NSHTTPURLResponse *httpResponse=(NSHTTPURLResponse *)response;
    if ([response respondsToSelector:@selector(allHeaderFields)]) {
        NSDictionary *dict=[httpResponse allHeaderFields];
//      NSLog(@"dict--%@",dict);
        NSString *time=[dict objectForKey:@"Date"];
        NSLog(@"date--%@___class---%@",date,[date class]);
    }
}

这时候接收到的数据是这样的

Tue, 30 Jun 2015 03:55:54 GMT

类型是NSCFString,如果我们需要用的是NSDate的数据就需要进行转换。。。。。。

转换的方法是。。。。。。。。。。。你需要了解的知识是截取字符串,格式化......具体做法是这样的,可以写一个转换的函数,把字符串作为参数传进来,1、截取字符串

NSString *timeStr=[str substringWithRange:NSMakeRange(5, 20)];//截取字符串

2、格式化

NSDateFormatter *formatter = [[NSDateFormatter alloc] init];

[formatter setDateFormat:@"dd MMM yyyy HH:mm:ss"];//设置源时间字符串的格式

NSDate* date = [formatter dateFromString:timeStr];//将源时间字符串转化为NSDate

在模拟器上运行的时候,你会发现出来的数据比标准时间还少了8小时。。。。。。Why????

少了这个

NSTimeZone *timeZone = [NSTimeZone timeZoneWithName:@"GMT"];

[formatter setTimeZone:timeZone];

好,以为做完了,模拟器上也正常了,真机试试,出来的值为null.....好烦...其实还少了配置区域

是这样:

NSLocale *local=[[NSLocale alloc]initWithLocaleIdentifier:@"en_US_POSIX"];

[formatter setLocale:local];//需要配置区域,不然会造成模拟器正常,真机日期为null的情况

en_US_POSIX是什么?查了一下,还有另外一个选择,是en_US,两个有什么区别呢?目前换了另一个参数看上去结果是一样的,但是苹果推荐用en_US_POSIX,文档上说的意思大约是,en_US_POSIX和en_US出来的时间是一样的,但是如果美国,在未来的某个时刻,它改变日期格式的方式,用“en_US”将改变以反映新的行为,但“en_US_POSIX”不会,在机器上(“en_US_POSIX”适用于iPhone操作系统一样,它在Mac OS X上。

最后付上转换代码:

-(NSDate *)dateFromNSString:(NSString *)str{
    //Tue, 30 Jun 2015 03:55:54 GMT
    //30 Jun 2015 03:55:54
     NSString *timeStr=[str substringWithRange:NSMakeRange(5, 20)];//截取字符串
     NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
     NSTimeZone *timeZone = [NSTimeZone timeZoneWithName:@"GMT"];
     NSLocale *local=[[NSLocale alloc]initWithLocaleIdentifier:@"en_US_POSIX"];
     [formatter setLocale:local];//需要配置区域,不然会造成模拟器正常,真机日期为null的情况
     [formatter setTimeZone:timeZone];
     [formatter setDateFormat:@"dd MMM yyyy HH:mm:ss"];//设置源时间字符串的格式
      NSDate* date = [formatter dateFromString:timeStr];//将源时间字符串转化为NSDate
      NSLog(@"date--%@___class---%@",date,[date class]);
    //可以自己再换格式,上面是源,下面是目标
//     NSDateFormatter* toformatter = [[NSDateFormatter alloc] init];
//     [toformatter setDateStyle:NSDateFormatterMediumStyle];
//     [toformatter setTimeStyle:NSDateFormatterShortStyle];
//     [toformatter setDateFormat:@"yyyy/MM/dd HH:mm:ss"];//设置目标时间字符串的格式
//     NSString *targetTime = [toformatter stringFromDate:date];//将时间转化成目标时间字符串
//     NSDate* toDate = [formatter dateFromString:targetTime];//将源时间字符串转化为NSDate
      return date;
}
时间: 2024-10-13 10:13:17

iOS获取网络时间与转换格式的相关文章

php获取当前时间和转换格式

## 获取时间和转换格式```//1.time():返回当前时间的Unix时间戳$stimestamp = time();$date = date("Y-m-d h:i:sa",$stimestamp) //2.mktime():返回一个指定日期的Unix时间戳//语法:mktime(hour,minute,second,month,day,year,is_dst);$stimestamp = mktime(9,12,31,6,10,2016)$date = date("Y-

多方法获取网络时间

转自:http://blog.csdn.net/xiaoxian8023/article/details/7250385 在做YH维护的时候,偶尔会碰到这样的问题:电脑的非正常关机导致系统时间出错(变为了2002-1-1),从而影响到项目系统的使用.尤其是设计到money的系统,如果时间错误,可能会导致无法想象的后果.所以我们可能需要用系统和网络的双重验证. 通过收集.修改.优化和测试,剔除了一些错误的和速度超慢的,只剩下了4种可行的方案.这些方案中主要有3类: 一.通过向某网站发送请求,获取服

cocos2dx获取网络时间(一)

今天在公司的cocos2dx项目中遇到一个需求,需要获取网络时间和系统时间对比,目的是防止用户更改系统时间进行某些非法操作 . 那么cocos2dx怎么来获取网络时间呢 ?我整理的思路如下: (1)由一个web api可以返回当前的网络时间 (2)cocos2dx通过http请求该api获取数据到本地 (3)cocos2dx解析数据得到当前的网络时间 一:首先就需要一个web接口来提供网络时间的数据,我在这里自己搭建一个WCF服务返回需要的数据. 新建WCF服务应用程序 , 项目命名为NetTi

实时获取网络时间 并转换为北京时间的函数

unit Unit1; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs,Winapi.msxml, System.DateUtils, Vcl.StdCtrls; type TForm1 = class(TForm) Button1: TButton

获取网络时间

这两天有一个应用需要获取网络时间,虽然一直知道可以从时间服务器获取时间,却从来也没有操作过,借这个机会重新进行一下深入了了解. 基本的思路就是:通过SOCKET连接时间服务器,直接接收从服务器发送的过来的时间数据. void GetNetTime() { TIME_ZONE_INFORMATION tzinfo; DWORD dwStandardDaylight; int nRet; /* Get server IP */ struct hostent *host; char *pServerI

iOS 获取当前时间格式化字符串

iOS 获取当前时间格式化字符串 太阳火神的美丽人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致"创作公用协议 转载请保留此句:太阳火神的美丽人生 -  本博客专注于 敏捷开发及移动和物联设备研究:iOS.Android.Html5.Arduino.pcDuino,否则,出自本博客的文章拒绝转载或再转载,谢谢合作. // 获取系统当前时间 NSDate * date = [NSDate date]; NSDateFormatt

.net 获取网络时间(北京时间)24小时制

/// <summary> /// 更新系统时间 /// </summary> public class UpdateTime { //设置系统时间的API函数 [DllImport("kernel32.dll")] private static extern bool SetLocalTime(ref SYSTEMTIME time); [StructLayout(LayoutKind.Sequential)] private struct SYSTEMTIM

cocos2dx获取网络时间(二):浅析CCHttpClient

在上一篇文章cocos2dx获取网络时间(一)中,我们使用CCHttpClient进行网络时间的数据请求和使用rapidjson解析Http请求得到的json数据 .在文章的最后 ,我留下了一个问题,怎么封装一个类来实现我们的方法. 新建一个c++类 ,命名为NetTime,继承自CCNode并重写init()方法.然后引入CCHttpClient和rapidjson需要的头文件.我们的需求是可以返回NetTime的年,月,日,小时,分和秒,分别定义它们的private字段和public方法:

QTP获取系统时间并自定义格式

function GetDateTime(Nowstr)          Dim Currentdatetime           Dim YY   'Year          Dim MM   'Month          Dim DD   'Day          Dim HH 'Hour          Dim Min  'MInute          Dim SS   'Second          Currentdatetime=now()          YY=Ye