来自字符串的日期不适用于特定日期

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 为零。