UTC24小时格式转本地12小时格式及逆向转换的OC代码问题
Hey there! Let's work through your date conversion needs step by step, fixing potential issues in the provided code and sharing reliable implementations.
1. Convert UTC 24-hour String to Local 12-hour Format
Your goal is to turn a UTC string like 20-Nov-2019 21:09 into a local 12-hour format (e.g., 20-Nov-2019 04:09 PM depending on your time zone).
Issue with Your Current Code
The code you shared skips a critical first step: parsing the input UTC string into an NSDate object. You tried to reconfigure the same date formatter and call stringFromDate:date, but didn't define how date was created from your input string. Here's the corrected approach:
Correct Implementation
// Step 1: Parse the UTC string into an NSDate object NSString *utcInputString = @"20-Nov-2019 21:09"; NSDateFormatter *utcParser = [[NSDateFormatter alloc] init]; utcParser.dateFormat = @"dd-MMM-yyyy HH:mm"; utcParser.timeZone = [NSTimeZone timeZoneWithAbbreviation:@"UTC"]; // Use en_US_POSIX to avoid locale-specific parsing errors utcParser.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"]; NSDate *utcDate = [utcParser dateFromString:utcInputString]; // Step 2: Convert the NSDate to a local 12-hour format string NSDateFormatter *localFormatter = [[NSDateFormatter alloc] init]; localFormatter.dateFormat = @"dd-MMM-yyyy hh:mm a"; localFormatter.timeZone = [NSTimeZone localTimeZone]; // Use current locale for natural AM/PM formatting localFormatter.locale = [NSLocale currentLocale]; NSString *local12HourString = [localFormatter stringFromDate:utcDate]; NSLog(@"Local 12-hour result: %@", local12HourString); // Example output (for UTC-5 time zone): 20-Nov-2019 04:09 PM
2. Convert Local 12-hour Format to UTC 24-hour Format
You provided two methods for this conversion, but we can refine them to be more reliable and avoid unnecessary manual time interval calculations.
Improved Implementation
// Convert a local date string (supports both 24-hour and 12-hour formats) to UTC 24-hour string - (NSString *)convertLocalDateStringToUTC:(NSString *)localDateString { // Step 1: Parse the local string into an NSDate NSDateFormatter *localParser = [[NSDateFormatter alloc] init]; localParser.timeZone = [NSTimeZone localTimeZone]; localParser.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"]; // Try 24-hour format first localParser.dateFormat = @"dd-MMM-yyyy HH:mm"; NSDate *localDate = [localParser dateFromString:localDateString]; // Fall back to 12-hour format if needed if (!localDate) { localParser.dateFormat = @"dd-MMM-yyyy hh:mm a"; localDate = [localParser dateFromString:localDateString]; } // Step 2: Convert to UTC 24-hour string if (localDate) { NSDateFormatter *utcFormatter = [[NSDateFormatter alloc] init]; utcFormatter.dateFormat = @"dd-MMM-yyyy HH:mm"; utcFormatter.timeZone = [NSTimeZone timeZoneWithName:@"UTC"]; utcFormatter.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"]; return [utcFormatter stringFromDate:localDate]; } return nil; // Return nil if parsing fails } // Alternative: Convert an existing NSDate (local time) directly to UTC string - (NSString *)convertLocalDateToUTCString:(NSDate *)localDate { NSDateFormatter *utcFormatter = [[NSDateFormatter alloc] init]; utcFormatter.dateFormat = @"dd-MMM-yyyy HH:mm"; utcFormatter.timeZone = [NSTimeZone timeZoneWithName:@"UTC"]; utcFormatter.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"]; return [utcFormatter stringFromDate:localDate]; }
Key Best Practices
- Always set
localetoen_US_POSIXwhen parsing fixed-format date strings. This prevents issues with device-specific locale settings (like different month abbreviations or 12/24-hour preferences). - Explicitly define the
timeZonefor both parsing and formatting to ensure you're working with the correct time context. - Remember:
NSDateobjects represent absolute time points—time zones only matter when converting between dates and human-readable strings.
内容的提问来源于stack exchange,提问作者Naresh

