将确切的NSString值转换为NSDate

时间:2015-06-03 06:25:58

标签: objective-c nsstring nsdate

这是我的代码。

NSString *dateString = @"2015-06-03 02:19:37";

NSDateFormatter *formatter = [NSDateFormatter new];
[formatter setDateFormat:@"yyyy-MM-dd hh:mm:ss"];

NSLog(@"converted date = %@",[formatter dateFromString:dateString]);

上面代码的输出是:"转换日期= 2015-06-02 18:19:37 + 0000"。我知道这是因为它将NSString转换为GMT,但我想要发生的是NSDate必须是2015-06-03 02:19:37,与dateString相同

4 个答案:

答案 0 :(得分:2)

  

我知道这是因为[NSDateFormatter]将NSString转换为GMT ......

不,你错了。 NSDateFormatter默认使用您当前的时区。

你不理解的是" 2015-06-02 18:19:37 + 0000" 的日期和时间相同 为" 2015-06-03 02:19:37" (在您当地的时区,必须是GMT + 0800)。

此外,您记录的描述只是日期的一种表示形式。日期没有年,月,日,小时,分钟,秒或其中任何一个。日期对象只代表一个时刻。这些时刻不具备任何内容,NSDate对象也不会。只有表示的时刻具有这些东西,并且它们只是通过在特定日历和时区处理日期而得出的。在任何情况下,任何给定日期都有多个表示。仅仅因为记录的描述恰好选择了一个你并不期望的表示并不意味着日期是错误的。

您在记录时已隐式请求从NSDate对象转换为字符串。这是因为日志记录总是涉及字符串。 NSLog()%@格式说明符使用的字符串格式代码使用-description方法。您永远无法强制NSDate实施-description来使用您的时区,所以请勿尝试。

如果你真的需要一个字符串表示(并且你不只是调试)并且你想要它在某个特定时区或者想要指定格式,那就不要依赖{{1}像你这样的方法。相反,请使用日期格式化程序明确地从-description转换为NSDate,并配置日期格式化程序以生成所需的表示形式。

但不要把这样做的必要性与错误的日期混为一谈。

  

我真正想做的是检查给定的NSString是否已经过美国东部时间晚上9点(格林威治标准时间-4点),而我是在+ 8GMT时区。

因此,请使用NSDateNSCalendarNSTimeZone在美国东部标准时间晚上9点构建NSDateComponents(在当天,我想你的意思是),然后比较日期。

NSDate

在这里,我使用了便捷方法NSDate* date = /* ... */; NSCalendar* calendar = [[NSCalendar alloc] initWithIdentifier:NSCalendarIdentifierGregorian]; calendar.timeZone = [NSTimeZone timeZoneWithName:@"America/New_York"]; NSDate* deadline = [calendar dateBySettingHour:21 minute:0 second:0 ofDate:date options:0]; if ([date compare:deadline] == NSOrderedDescending) /* date is after deadline */; ,并避免直接使用-dateBySettingHour:minute:second:ofDate:options:。如果您的需求不同,您可能需要使用日历转换日期到日期组件,修改组件,将它们转换回日期,然后进行比较。

答案 1 :(得分:-1)

使用NSDateComponents类根据字符串中的信息构建日期。文档明确提供了一个示例:

NSDateComponents *comps = [[NSDateComponents alloc] init];
[comps setDay:6];
[comps setMonth:5];
[comps setYear:2004];
NSCalendar *gregorian = [[NSCalendar alloc]
    initWithCalendarIdentifier:NSGregorianCalendar];
NSDate *date = [gregorian dateFromComponents:comps];
[comps release];
NSDateComponents *weekdayComponents =
    [gregorian components:NSWeekdayCalendarUnit fromDate:date];
int weekday = [weekdayComponents weekday];

答案 2 :(得分:-1)

使用字符串值调用此方法...

 - (NSDate *)dateFromString:(NSString *)date
        {
            static NSDateFormatter *dateFormatter;
            if (!dateFormatter)
            {
                dateFormatter = [[NSDateFormatter alloc] init];
                [dateFormatter setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"]];
                [dateFormatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];
                [dateFormatter setDateFormat:@"dd-MM-yyyy"];
            }

            NSLog(@"Date: %@",date);

            return [dateFormatter dateFromString:date];
        }


    RESULT : Date: 2015-06-03 02:19:37

答案 3 :(得分:-2)

NSString *dateString = @"2015-06-03 02:19:37";     
NSDateFormatter *f = [[NSDateFormatter alloc] init];
[f setDateFormat:@"yyyy-MM-dd"];
 NSDate *startDate = [f dateFromString:dateString];

你会在这里得到NSDate(startDate)....愿这对你有帮助.....