문제

날짜를 특정 형식으로 인쇄하려고합니다.

NSDate *today = [[NSDate alloc] init];
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"yyyyMMddHHmmss"];
NSString *dateStr = [dateFormatter stringFromDate:today];

iPhone이 24 시간으로 설정되면 제대로 작동합니다. 반면에 사용자가 24 시간으로 설정 한 다음 AM/PM으로 돌아 가면 (이 설정을 전환 할 때까지 잘 작동 함) AM이 추가됩니다. /PM이 요청하지 않더라도 끝에 :

20080927030337 PM

내가 뭔가 잘못하고 있습니까? 아니면 펌웨어 2.1의 버그입니까?

편집 1 : 설명을 명확하게 만들었습니다

편집 2 해결 방법 : 이것은 버그라는 것이 밝혀졌습니다. 문제를 해결하려면 AM과 PM 문자를 ""로 설정합니다.

[dateFormatter setAMSymbol:@""];
[dateFormatter setPMSymbol:@""];
도움이 되었습니까?

해결책

시뮬레이터와 2.1 펌웨어와 24 시간의 전화기가있는 휴대 전화에 게시 한 코드를 사용하여 다음과 같은 경우 AM/PM이 DateSt에 추가되지 않았습니다.

NSLog(@"%@", dateStr);

여기에 게시하지 않은 DateStr와 다른 일을하고 있습니까? 값을 어떻게 확인하고 있습니까?

후속 조치

AM/PM 설정을 켜고 끄십시오. 나는 그렇게 할 때까지 문제가 없었습니다. 나는 당신과 같은 방식으로 그것을 인쇄하고 있습니다.

좋아, 나도 할 때도 봅니다. 버그가되어야합니다. 나는 당신을 추천합니다 버그 보고서를 제출하십시오 그 동안 원치 않는 캐릭터를 확인하고 필터링하십시오.

다른 팁

이 행동의 이유는 로케일이며 올바른 로케일을 설정합니다.

당신의 로컬을 설정하십시오 nsdateformatter 에게 en_us_posix 이것을 고칠 것입니다. 24 시간과 12 시간 형식 모두에서 작동합니다.

On iPhone OS, the user can override the default AM/PM versus 24-hour time setting (via Settings > General > Date & Time > 24-Hour Time), which causes NSDateFormatter to rewrite the format string you set. 에서 사과 의사

이 시도,

NSDate *today = [[NSDate alloc] init];
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"]];
[dateFormatter setDateFormat:@"yyyyMMddHHmmss"];
NSString *dateStr = [dateFormatter stringFromDate:today];

iPhone SDK 버그에 대한 설명은 다음과 같습니다 (여전히 3.1 베타 SDK에도 있습니다).

먼저 iPhone 사용자 인터페이스에 대한 약간의 배경. iPhone 사용자가 "미국"과 "프랑스"사이에서 지역 형식을 변경하면 사용자의 "24 시간"설정이 해당 지역에서 가장 널리 퍼진 모드로 자동 전환됩니다. 프랑스에서는 24 시간 시간을“ON”, 그리고 미국에서는“꺼짐”으로 설정했습니다. 그런 다음 사용자는 해당 설정을 수동으로 무시할 수 있으며 문제가 시작됩니다.

문제는 NSDateFormatter에서 사용자가 수동으로 선택한 12 또는 24 시간 시간 모드에서 "고정"에서 나옵니다. 따라서 프랑스 사용자가 수동으로 12 시간 모드를 선택하고 응용 프로그램이 NSDateFormatter를 24 시간 형식의 "HHMM"으로 출력을 요청한 경우 실제로 12 시간 형식의 "01:00 PM", 예를 들어 시간을받습니다. 마치 응용 프로그램이 대신 "HHMM AA"를 요청한 것처럼. 미국 사용자가 수동으로 24 시간 모드를 선택한 경우 그 반대가 발생합니다. 12 시간 형식의 "HHMM AA"로 출력 시간은 실제로 24 시간 형식 (예 :“17:00”대신 시간을 얻습니다.

자세한 내용과 가능한 해결 방법은 이에 대해 찾을 수 있습니다. 블로그.

날짜 Formatter에 로케일을 EN_US로 설정하면 문제가 해결됩니다.

    NSDateFormatter * f = [[NSDateFormatter alloc] init];
    [f setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss'Z'"];
    f.timeZone = [NSTimeZone timeZoneForSecondsFromGMT:0];
    f.calendar = [[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar] autorelease];
    f.locale = [[[NSLocale alloc] initWithLocaleIdentifier:@"en_US"] autorelease];

캘린더를 추가 해야하는지 확실하지 않지만 이것은 잘 작동합니다.

나는 이것이 해결책이라고 생각합니다.

NSDateFormatter *df =[[NSDateFormatter alloc] init];
        [df setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
        NSLocale *usLocale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US"];

[df setLocale: usLocale];

[usLocale release];

 NSDate *documento_en_Linea =[[[NSDate alloc] init]autorelease];

documento_en_Linea=[df dateFromString:@"2010-07-16 21:40:33"];

[df release];

        NSLog(@"fdocumentoenLineaUTC:%@!",documento_en_Linea);


//ouput  
     fdocumentoenLineaUTC:2010-07-16 09:40:33 p.m. -0500!

NSDateFormatter를 사용하여 24 시간 시간을 구문 분석 하고이 버그를 치고 싶은이 질문을 찾는 사람들에게는 NSDATECOMONTENTS를 사용하여 날짜와 시간을 구문 분석하여 알려진 형식 이이 문제를 해결합니다.

NSString *dateStr = @"2010-07-05";
NSString *timeStr = @"13:30";

NSDateComponents *components = [[NSDateComponents alloc] init];
components.year = [[dateStr substringToIndex:4] intValue];
components.month = [[dateStr substringWithRange:NSMakeRange(5, 2)] intValue];
components.day = [[dateStr substringFromIndex:8] intValue];
components.hour = [[timeStr substringToIndex:2] intValue];
components.minute = [[timeStr substringFromIndex:3] intValue];

NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];

NSDate *date = [calendar dateFromComponents:components];

[components release];
[calendar release];

이것은 또한 작동해야합니다 (나는 약간의 bizzare 결과가 보이고 있습니다).

-(NSString*)lowLevTime:(NSString*)stringFormat {
    char buffer[50];
    const char *format = [stringFormat UTF8String];
    time_t rawtime;
    struct tm * timeinfo;
    time(&rawtime);
    timeinfo = localtime(&rawtime);
    strftime(buffer, sizeof(buffer), format, timeinfo);
    return [NSString  stringWithCString:buffer encoding:NSASCIIStringEncoding];
}

짧은 대답 : 시도하십시오 [dateFormatter setDateFormat:@"yyyyMMddhhmmss"]; 12 시간 형식의 경우 (소문자를 참고하십시오 hh).

많은 웹 사이트가 사용한다고 표시하기 때문에 실망스러운 주제였습니다. HH 몇 시간 동안 (공식 Apple 문서 포함), 그러나 24 시간 형식으로 설정하는 반면 hh 12 시간 형식을 사용합니다. 보다 http://unicode.org/reports/tr35/tr35-6.html#date_format_patterns 자세한 사항은.

보너스로 사용할 수도 있습니다. KK 또는 kk 하루의 시간 형식은 하나씩 꺼질 것입니다.

업데이트 : 최근에 nslocale (https://developer.apple.com/library/mac/#documentation/cocoa/reference/foundation/classes/nslocale_class/reference/reference.html을보고 있었고 사용할 수있는 것 같습니다. AutoupDatingCurrentLocale 앱 내에서 로케일로 변경된 변경 사항을 적용합니다. 이것의 결과는 전화기가 24 시간 시계를 사용하도록 설정 되더라도 (프랑스로 전환했을 때와 같이) 휴대 전화의 다른 앱에 영향을 미치지 않는 앱의 12/24 토글을 만들 수 있다는 것입니다. 또는 앱을 남겨두고 변경해야합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top