关于使用xcode 7.01
的特定日期10-18-15,我有一个非常奇怪的问题运行代码:
#import "ViewController.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
NSString *stringDate =@"10-18-15";
NSDateFormatter *dateFormatter = [NSDateFormatter new];
dateFormatter.dateStyle = NSDateFormatterShortStyle;
dateFormatter.timeStyle = NSDateFormatterNoStyle;
NSDate *myDate = [dateFormatter dateFromString:stringDate];
NSLog(@"Mydate:%@ Text: %@",myDate,stringDate);
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end
输出:
2015-10-20 10:37:55.129 teste [3286:95083] Mydate:(null)文字:10-18-15
如果我更改NSString *stringDate =@"10-17-15";
输出:
2015-10-20 10:22:10.741 teste[3102:82782] Mydate:2015-10-17 03:00:00 +0000 Text: 10-17-15
似乎这个日期10-18-2015在NSDate
数据库
知道怎么解决吗?
答案 0 :(得分:2)
我发现了同样的问题:swift 2.0 NSDateFormatter中的错误?行为取决于格式化程序使用的timeZone。例如:America / Sao_Paulo在圣保罗,timeanddate.com/time/change/brazil/sao-paulo?year=2015 2015年10月18日星期日,00:00:00时钟前转1小时至2015年10月18日星期日,01:00:00当地日光时间相反,这意味着,圣保罗没有2015-10-18 00:00:00。至于NSDateFormatter,当它从字符串中没有收到时间信息时,它假定时区的时间是00:00:00。这就是它返回零的原因。
答案 1 :(得分:1)
更新:设置日期格式化程序的日历属性至关重要!
从特定日期到字符串的转换可能会失败,因为某些日期在某些时区(例如BRT)中根本不存在,因为夏令时发生在午夜。所以实际上没有午夜和10-18-15 00:00 (BRT)
(假设没有指定午夜的时间)只是一个有效的日期。
但是,当指定日历对象时(仅使用公历对其进行测试),日期格式化程序似乎变得更加智能化了#34;并且回到当天的开始,即10-18-15 1:00 AM
,而不是返回nil
。
NSString *stringDate = @"10-18-15";
NSDateFormatter *dateFormatter = [NSDateFormatter new];
dateFormatter.calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
dateFormatter.dateFormat = @"MM-dd-yy";
NSDate *myDate = [dateFormatter dateFromString:stringDate];
以下是一些显示行为的代码。我使用了Xcode Playground,所以它在Swift中......
import UIKit
func printDateForString(string: String, dateFormatter: NSDateFormatter, timeZone: NSTimeZone? = nil) {
let date = dateFormatter.dateFromString(dateString)
print("result: ", terminator: "")
if let date = date {
let outputDateFormatter = NSDateFormatter()
outputDateFormatter.dateStyle = .ShortStyle
outputDateFormatter.timeStyle = .ShortStyle
outputDateFormatter.calendar = NSCalendar(identifier: NSCalendarIdentifierGregorian)!
outputDateFormatter.timeZone = timeZone
print(outputDateFormatter.stringFromDate(date))
}
else {
print("nil")
}
}
let dateString = "10-18-15"
let dateFormat = "MM-dd-yy"
let timeZone = NSTimeZone(name: "America/Sao_Paulo")!
print("configure date formatter without setting its calendar property")
let dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = dateFormat
dateFormatter.timeZone = timeZone
printDateForString(dateString, dateFormatter: dateFormatter, timeZone: timeZone)
print("after setting date formatter's calendar property to non-nil (Gregorian)")
dateFormatter.calendar = NSCalendar(identifier: NSCalendarIdentifierGregorian)
printDateForString(dateString, dateFormatter: dateFormatter, timeZone: timeZone)
print("resetting calender property of date formatter to nil")
dateFormatter.calendar = nil
printDateForString(dateString, dateFormatter: dateFormatter, timeZone: timeZone)
输出:
配置日期格式化程序而不设置其日历属性
结果:无 将日期格式化程序的日历属性设置为非零(格里高利)后 结果:2015年10月18日,上午1:00 将日期格式化程序的日历属性重置为零 结果:没有
原始回答:
从字符串转换为日期时,应明确设置日期格式:
NSString *stringDate = @"10-18-15";
NSDateFormatter *dateFormatter = [NSDateFormatter new];
dateFormatter.dateFormat = @"MM-dd-yy";
NSDate *myDate = [dateFormatter dateFromString:stringDate];
答案 2 :(得分:0)
尝试将NSdate赋予此格式,该格式返回日期,以后可以将其转换为短格式的NSDate / NSString
例如:
NSDate *stringDate=[NSDate dateWithTimeIntervalSinceNow:0];
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc]init];
dateFormatter.dateStyle = NSDateFormatterShortStyle;
dateFormatter.timeStyle = NSDateFormatterNoStyle;
NSString *myDate = [dateFormatter stringFromDate:stringDate];
如果你想要使用NSString,那么将它转换为NSdate并将其解析为格式化程序。