Objective c 如何获得系统时间和目标时区作为输入的(hh:mm)?

Objective c 如何获得系统时间和目标时区作为输入的(hh:mm)?,objective-c,Objective C,例如,如果用户的系统时钟为上午10:00(太平洋标准时间时区)。如何在Objective-C中将其转换为13:00(东部时间时区) 最终目标是找到一个时间间隔检查器 -(BOOL)isCurrentTimeBetweenStart:(NSString *)startTimeStr endTime:(NSString *)endTimeStr timezone:(NSString*)timezone{ NSDateFormatter *formatter = [[NSDateFormat

例如,如果用户的系统时钟为上午10:00(太平洋标准时间时区)。如何在Objective-C中将其转换为13:00(东部时间时区)

最终目标是找到一个时间间隔检查器

-(BOOL)isCurrentTimeBetweenStart:(NSString *)startTimeStr endTime:(NSString *)endTimeStr timezone:(NSString*)timezone{

    NSDateFormatter *formatter = [[NSDateFormatter alloc]init];
    [formatter setDateFormat:@"hh:mm a"];

    NSDateFormatter *formatterEST = [[NSDateFormatter alloc]init];
    [formatterEST setDateFormat:@"hh:mm a"];
    [formatterEST setTimeZone:[NSTimeZone timeZoneWithName:timezone]];
    NSString *currentTimeStr = [formatterEST stringFromDate: [NSDate date]];

    int startTimeMinutes   = [self minutesSinceMidnight:[formatter dateFromString:startTimeStr]];
    int endTimeMinutes  = [self minutesSinceMidnight:[formatter dateFromString:endTimeStr]];
    int currentTimeMinutes = [self minutesSinceMidnight:[formatter dateFromString:currentTimeStr]];

    if (startTimeMinutes <= currentTimeMinutes && currentTimeMinutes <= endTimeMinutes) {
        return YES;
    }

    return NO;
}

-(NSDate *) toLocalTime : (NSDate *)date
{
    NSTimeZone *tz = [NSTimeZone defaultTimeZone];
    NSInteger seconds = [tz secondsFromGMTForDate: date];
    return [NSDate dateWithTimeInterval: seconds sinceDate: date];
}

-(int) minutesSinceMidnight:(NSDate *)date{
    NSDateComponents *components = [[NSCalendar currentCalendar] components:NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond fromDate:date];
    return 60 * (int)[components hour] + (int)[components minute];
}

日期在内部以GMT(UTC)为参考进行存储。在创建日期时,默认使用用户本地时区,将数据转换为字符串表示时也是如此

如果要在另一个时区中使用字符串表示,请使用
NSDateFormatter
设置所需的时区。

使用并设置其
时区
属性,如下所示:

NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
formatter.dateStyle = NSDateFormatterNoStyle;
formatter.timeStyle = NSDateFormatterShortStyle;
formatter.timeZone = [NSTimeZone timeZoneWithName:@"America/New_York"];
NSString *timeString = [formatter stringFromDate:someDate];
请注意,NSTimeZone确实有一个
+TimeZoneWithAbRevision:
方法,它接受诸如“EST”之类的字符串,但文档本身建议不要使用它:

一般来说,除了“UTC”或“GMT”等独特实例外,不鼓励您使用缩写。时区缩写没有标准化,因此给定的缩写可能有多种含义,例如,“EST”指美国和澳大利亚的东部时间

您可以使用
+knownTimeZoneNames
获取可用时区名称的列表,如果需要,允许用户从该列表中选择要使用的时区

NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
formatter.dateStyle = NSDateFormatterNoStyle;
formatter.timeStyle = NSDateFormatterShortStyle;
formatter.timeZone = [NSTimeZone timeZoneWithName:@"America/New_York"];
NSString *timeString = [formatter stringFromDate:someDate];