NSDate:仅提取日期

时间:2014-06-21 19:30:52

标签: ios nsdate nsdateformatter

我正在使用以下代码仅从NSDate中提取日期。我做错了什么?

    NSDate* now = [NSDate date];
    NSLog(@"Now Date %@",now);
    NSDateFormatter *format = [[NSDateFormatter alloc] init];
    format.dateFormat = @"dd-MM-yyyy";
    NSString *stringDate = [format stringFromDate:now];
    NSDate *todaysDate = [format dateFromString:stringDate];
    NSLog(@"Today's Date without Time %@", todaysDate);

日志:

2014-06-21 12:27:23.284 App[69727:f03] Now Date 2014-06-21 19:27:23 +0000
2014-06-21 12:27:23.285 App[69727:f03] Today's Date without Time 2014-06-21 07:00:00 +0000

为什么我会收到:07:00:00 +0000最后?

我想以下列格式获得NSDate:

2014-06-21 00:00:00 +0000

0的时间,秒等等并不重要。

5 个答案:

答案 0 :(得分:5)

NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
[dateFormat setDateFormat:@"yyyy-MM-dd"];
NSDate *now = [[NSDate alloc] init];
NSString *theDate = [dateFormat stringFromDate:now];

应该有效

答案 1 :(得分:5)

另一个解决方案:使用NSCalendar:

NSCalendar *cal = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
[cal setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:1]]; // I'm in Paris (+1)
NSDateComponents *comps = [cal components:NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay fromDate:[NSDate date]];

comps.hour = 0;
comps.minute = 0;
comps.second = 0;

NSDate *newDate = [cal dateFromComponents:comps ];

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

调整时区参数,您将收到如下内容:日期:2014-06-21 00:00:00 +0000

答案 2 :(得分:3)

如果您不关心时间,NSDate不适合您。 NSDate表示特定时刻 - 没有时间没有NSDate。您所看到的是NSDate的已记录描述,这是GMT中的完整打印输出。

如果您只想跟踪年,月和日,那么请改用NSDateComponents,并仅提取您感兴趣的组件。然后您可以使用组件对象并根据需要传递它。

答案 3 :(得分:2)

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"dd-MM-yyyy"];
NSString *strDate = [dateFormatter stringFromDate:[NSDate date]];

使用上面的代码,NSDate对象将有时间。但该字符串将是仅限日期的文本。

答案 4 :(得分:0)

这是使用的代码。

#include <time.h>

- (NSDate *)dateFromISO8601String:(NSString *)string {
    if (!string) {
        return nil;
    }

    struct tm tm;
    time_t t;

    strptime([string cStringUsingEncoding:NSUTF8StringEncoding], "%Y-%m-%dT%H:%M:%S%z", &tm);
    tm.tm_hour = 0;
    tm.tm_min = 0;
    tm.tm_sec = 0;
    tm.tm_isdst = -1;
    t = mktime(&tm);

    return [NSDate dateWithTimeIntervalSince1970:t + [[NSTimeZone localTimeZone] secondsFromGMT]];
}


- (NSString *)ISO8601String:(NSDate*)aDate {
    struct tm *timeinfo;
    char buffer[80];

    time_t rawtime = [aDate timeIntervalSince1970] - [[NSTimeZone localTimeZone] secondsFromGMT];
    timeinfo = localtime(&rawtime);

    strftime(buffer, 80, "%Y-%m-%dT%H:%M:%S%z", timeinfo);

    return [NSString stringWithCString:buffer encoding:NSUTF8StringEncoding];
}


NSString *currentDateStr = [self ISO8601String:[NSDate date]];

NSDate *dateWithoutTime = [self dateFromISO8601String:currentDateStr];

NSLog(@"currentDateStr: %@",currentDateStr);
NSLog(@"dateWithoutTime: %@",dateWithoutTime);