来自字符串的日期不适用于特定日期
Date from string not working with specific date
关于一个特定日期 10-18-15 使用 xcode 7.01
我有一个非常奇怪的问题
运行代码:
#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] 我的日期:(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
NSDate
数据库
中的日期 10-18-2015 似乎已损坏
知道如何解决吗?
尝试将 NSdate 赋予此格式,returns 日期可以稍后转换为 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 并将其解析为格式化程序。
更新:设置日期格式器的日历很关键属性!
对于特定日期,从字符串到日期的转换可能会失败,因为某些日期在某些时区(例如 BRT)中根本不存在,因为夏令时切换发生在午夜。所以实际上没有午夜,10-18-15 00:00 (BRT)
(当没有指定时间时假定午夜)只是无效日期。
但是,当指定日历对象时(仅使用公历对其进行测试)日期格式化程序似乎变为 "smarter" 并回退到一天的开始,即 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 游乐场,所以它在 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)
输出:
configure date formatter without setting its calendar property
result: nil
after setting date formatter's calendar property to non-nil (Gregorian)
result: 10/18/15, 1:00 AM
resetting calender property of date formatter to nil
result: nil
原回答:
从字符串转换为日期时应明确设置日期格式:
NSString *stringDate = @"10-18-15";
NSDateFormatter *dateFormatter = [NSDateFormatter new];
dateFormatter.dateFormat = @"MM-dd-yy";
NSDate *myDate = [dateFormatter dateFromString:stringDate];
我发现了同样的问题:swift 2.0 NSDateFormatter 中的错误?行为取决于格式化程序使用的时区。例如: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。这就是为什么它 returns 为零。
关于一个特定日期 10-18-15 使用 xcode 7.01
我有一个非常奇怪的问题运行代码:
#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] 我的日期:(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
NSDate
数据库
知道如何解决吗?
尝试将 NSdate 赋予此格式,returns 日期可以稍后转换为 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 并将其解析为格式化程序。
更新:设置日期格式器的日历很关键属性!
对于特定日期,从字符串到日期的转换可能会失败,因为某些日期在某些时区(例如 BRT)中根本不存在,因为夏令时切换发生在午夜。所以实际上没有午夜,10-18-15 00:00 (BRT)
(当没有指定时间时假定午夜)只是无效日期。
但是,当指定日历对象时(仅使用公历对其进行测试)日期格式化程序似乎变为 "smarter" 并回退到一天的开始,即 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 游乐场,所以它在 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)
输出:
configure date formatter without setting its calendar property
result: nil
after setting date formatter's calendar property to non-nil (Gregorian)
result: 10/18/15, 1:00 AM
resetting calender property of date formatter to nil
result: nil
原回答:
从字符串转换为日期时应明确设置日期格式:
NSString *stringDate = @"10-18-15";
NSDateFormatter *dateFormatter = [NSDateFormatter new];
dateFormatter.dateFormat = @"MM-dd-yy";
NSDate *myDate = [dateFormatter dateFromString:stringDate];
我发现了同样的问题:swift 2.0 NSDateFormatter 中的错误?行为取决于格式化程序使用的时区。例如: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。这就是为什么它 returns 为零。