NSDateFormatter格式化日期,变成了下一年

  群里一个网友遇到了这样一个问题,获取当前系统日期,然后通过formatter获取string,之后直接打印出来,然后年份由2015年变成了2016年(借用网友的图片,侵删)

  我的第一反应是没有设置时区导致的,如果是时区问题的话,差距一般是一天,可这差一年是怎么回事?我重新把代码敲了一遍,如下:

- (void)dateTest {
    NSDate *date = [NSDate date];
    NSLog(@"date : %@", date);
    NSDateFormatter *dateForMatter = [[NSDateFormatter alloc] init];
    [dateForMatter setDateFormat:@"yyyyMMdd"];
    //[dateForMatter setTimeZone:[NSTimeZone timeZoneWithName:@"Asia/Shanghai"]];
    NSLog(@"Local date string : %@", [dateForMatter stringFromDate:date]);
}

  打印结果如下:

2015-12-28 10:29:04.292 Test[1692:320416] date : 2015-12-28 02:29:03 +0000
2015-12-28 10:29:07.523 Test[1692:320416] Local date string : 20151228

  并没有出现网友所说的问题,比对了一下代码以后发现唯一的区别就是dateFormat的格式,这位网友用的是“YYYYMMdd”,我这里用的是“yyyyMMdd”。同样的去查了一下Apple的开发文档,找到了下边的例子以及相应的解释,如下:

https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/DataFormatting/Articles/dfDateFormatting10_4.html#//apple_ref/doc/uid/TP40002369-SW1

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"yyyy-MM-dd ‘at‘ HH:mm"];

NSDate *date = [NSDate dateWithTimeIntervalSinceReferenceDate:162000];

NSString *formattedDateString = [dateFormatter stringFromDate:date];
NSLog(@"formattedDateString: %@", formattedDateString);
// For US English, the output may be:
// formattedDateString: 2001-01-02 at 13:00

There are two things to note about this example:

1. It uses yyyy to specify the year component. A common mistake is to use YYYY. yyyy specifies the calendar year whereas YYYY specifies the year (of “Week of Year”), used in the ISO year-week calendar. In most cases, yyyy and YYYY yield the same number, however they may be different. Typically you should use the calendar year.
2. The representation of the time may be 13:00. In iOS, however, if the user has switched 24-Hour Time to Off, the time may be 1:00 pm.

  意思大概是这样的,yyyy指定的是日历上的年份,而YYYY的到的则是现在下一周的年份,比如网友上边的日期是2015-12-28,用yyyy的到的是2015,用YYYY的到的就是2015年12月28号的下一周的年份,也就是2016年了。大多数情况下yyyy和YYYY的到的结果是一样的,但是到每年的最后一周的时候,得到的结果就是下一年。验证的代码如下:

- (void)dateTest {
    NSString *dateString1 = @"2015-12-27 00:00:00";
    NSString *dateString2 = @"2015-12-26 00:00:00";

    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
    [formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];

    NSDateFormatter *formatteryyyyMMdd = [[NSDateFormatter alloc] init];
    [formatteryyyyMMdd setDateFormat:@"yyyyMMdd"];

    NSDateFormatter *formatterYYYYMMdd = [[NSDateFormatter alloc] init];
    [formatterYYYYMMdd setDateFormat:@"YYYYMMdd"];

    NSDate *date1 = [formatter dateFromString:dateString1];
    NSDate *date2 = [formatter dateFromString:dateString2];

    NSLog(@"yyyyMMdd : %@, YYYYMMdd : %@", [formatteryyyyMMdd stringFromDate:date1], [formatterYYYYMMdd stringFromDate:date1]);
    NSLog(@"yyyyMMdd : %@, YYYYMMdd : %@", [formatteryyyyMMdd stringFromDate:date2], [formatterYYYYMMdd stringFromDate:date2]);
}

  得到的结果如下:

2015-12-28 11:39:59.642 Test[1739:331497] yyyyMMdd : 20151227, YYYYMMdd : 20161227
2015-12-28 11:40:03.017 Test[1739:331497] yyyyMMdd : 20151226, YYYYMMdd : 20151226

以上。

时间: 2024-12-23 18:15:28

NSDateFormatter格式化日期,变成了下一年的相关文章

31-40(PHC文件,UIApplication,Info.plis,监听return按钮,格式化日期,openURL)

31.监听return按钮 32.自动滚动表格到最后一行 33.格式化日期 34.返回每一组需要显示的头部标题 35.Info.plist常见的设置 36.PHC文件 37.UIApplication 38.UIApplication的常用属性 39.iOS7中的状态栏 40.openURL { 一个合格的程序员是不会写出 诸如 "摧毁地球" 这样的程序的,他们会写一个函数叫 "摧毁行星"而把地球当一个参数传进去. } 31.点击了return按钮(键盘最右下角的按

iOS开发之格式化日期时间

iOS开发之格式化日期时间 在开发iOS程序时,有时候需要将时间格式调整成自己希望的格式,这个时候我们可以用NSDateFormatter类来处理.例如: //实例化一个NSDateFormatter对象 NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; //设定时间格式,这里可以设置成自己需要的格式 [dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];

SQLServer格式化日期

SQL Server 格式化日期 CONVERT将某种数据类型的表达式显式转换为另一种数据类型.由于某些需求经常用到取日期格式的不同.现以下可在SQL Server中 将日期格式化.SQL Server 支持使用科威特算法的阿拉伯样式中的数据格式.在表中,左侧的两列表示将 datetime或 smalldatetime 转换为字符数据的style 值.给 style 值加 100,可获得包括世纪数位的四位年份 (yyyy). *    默认值(style 0 或 100.9 或 109.13 或

python 格式化日期

常用的时间函数如下 获取当前日期:time.time() 获取元组形式的时间戳:time.local(time.time()) 格式化日期的函数(基于元组的形式进行格式化): (1)time.asctime(time.local(time.time())) (2)time.strftime(format[,t]) 将格式字符串转换为时间戳: time.strptime(str,fmt='%a %b %d %H:%M:%S %Y') 延迟执行:time.sleep([secs]),单位为秒 例1:

Swift中格式化日期

Swift语言中格式化日期跟其它编程语言很相似: var dformatter = NSDateFormatter() dformatter.dateFormat = "yyyy年MM月dd日 HH:mm:ss" var datestr = dformatter.stringFromDate(date)

IOS 格式化日期时间

在开发iOS程序时,有时候需要将时间格式调整成自己希望的格式,这个时候我们可以用NSDateFormatter类来处理.例如: //实例化一个NSDateFormatter对象 NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; //设定时间格式,这里可以设置成自己需要的格式 [dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"]; //用[NSDate da

java高仿微博日期显示格式化,日期辅助工具类

原文:java高仿微博日期显示格式化,日期辅助工具类 源代码下载地址:http://www.zuidaima.com/share/1550463377902592.htm 仿新浪微博日期格式化工具类: 例如: 1. 刚刚 2. xx分钟前 3. hh小时前 4. 今天 HH:mm 5. 昨天 HH:mm 6. 前天 HH:mm 7. 上个月 yyyy-MM-dd HH:mm 8. 去年 yyyy-MM-dd HH:mm 9. 前年 yyyy-MM-dd HH:mm 今天写的代码,结构还很粗糙,只

iOS开发之格式化日期时间(转)

在开发iOS程序时,有时候需要将时间格式调整成自己希望的格式,这个时候我们可以用NSDateFormatter类来处理.例如: //实例化一个NSDateFormatter对象 NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; //设定时间格式,这里可以设置成自己需要的格式 [dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"]; //用[NSDate da

MySQL取得当前时间的函数是什么 格式化日期的函数是什么

取得当前时间用 now() 就行. 在数据库中格式化时间 用DATE_FORMA T(date, format) . 根据格式串format 格式化日期或日期和时间值date,返回结果串. 可用DATE_FORMAT( ) 来格式化DATE 或DATETIME 值,以便得到所希望的格式.根据format字符串格式化date值: %S, %s 两位数字形式的秒( 00,01, . . ., 59) %i 两位数字形式的分( 00,01, . . ., 59) %H 两位数字形式的小时,24 小时(