Object-C时区和时间 2023-03-25 周六

2023-03-24  本文已影响0人  勇往直前888

简介

生产线报了一个问题,就是照片的水印时间和服务器的操作时间对不上:
照片水印时间是3月21日; 而服务显示的处理时间是3月22日;

原因

拍照手机的时区设置成了外国。

水印日期:

查看了一下代码,水印日期的生成取的是手机本地时间:

    // 日期
    NSDate *now = [NSDate date]; /** 取当前的日期*/
    NSDateFormatter *formatter  = [[NSDateFormatter alloc] init];
    // 时区设置为系统默认时区
    NSTimeZone *timeZone = [NSTimeZone systemTimeZone];;
    [formatter setTimeZone:timeZone];
    [formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
    NSString *dateString = [formatter stringFromDate:now];
    dateString = [NSString stringWithFormat:@"%@ UTC+8", dateString];

如果解决时区问题?

    // 日期
    NSDate *now = [NSDate date]; /** 取当前的日期*/
    NSDateFormatter *formatter  = [[NSDateFormatter alloc] init];
    // 时区设置为UTC+8
    NSTimeZone *timeZone = [NSTimeZone timeZoneForSecondsFromGMT:(8 * 60 * 60)];
    [formatter setTimeZone:timeZone];
    [formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
    NSString *dateString = [formatter stringFromDate:now];
    dateString = [NSString stringWithFormat:@"%@ UTC+8", dateString];

通过代码调试跟踪可以知道NSDate *now = [NSDate date];这句话得到的时间是UTC时间
由于这里要的就是UTC+8,所以按照字面意思,时区设置为[NSTimeZone timeZoneForSecondsFromGMT:(8 * 60 * 60)]

经过这样修改之后,不论手机本身的时区设置是什么,水印图片上的时区都是东8区(北京时间),问题得到时间。

延伸问题:改了时间怎么办?

那么如何获得服务器时间呢?

有效的文章

服务器响应时间

计算时间差

/// 计算服务器时间与本地时间的差值
/// https://github.com/eye1234456/CorrectLocalTime
+ (NSTimeInterval)localDifferenceWithResponse:(NSURLResponse * __nullable)response {
    // 取服务器响应的Date字段
    if (![response isKindOfClass:NSHTTPURLResponse.class]) {
        return 0;
    }
    NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response;
    NSString *dateServer = [httpResponse.allHeaderFields objectForKey:@"Date"];
    if (dateServer == nil) {
        return 0;
    }
    if (![dateServer isKindOfClass:NSString.class]) {
        return 0;
    }
    
    // 将字符串转化为NSDate对象, UTC时间
    // dateServer类似Sun, 19 May 2002 15:21:36 GMT
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    [dateFormatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];
    [dateFormatter setDateFormat:@"EEE, d MMM yyyy HH:mm:ss zzz"];
    NSDate *inputDate = [dateFormatter dateFromString:dateServer];
    if (inputDate == nil) {
        return 0;
    }
    
    // 本地时间
    NSDate *localDate = [NSDate date];
    
    // 服务器时间与本地时间之间的误差
    NSTimeInterval distance = [inputDate timeIntervalSinceDate:localDate];
    
    return distance;
}

如何使用?

            // 计算时间差
            NSTimeInterval difference = [PDANetwork localDifferenceWithResponse:response];
            NSTimeInterval tolerance = 5 * 60; // 5 分钟
            if (fabs(difference) > tolerance) {
                NSLog(@"时间误差过大");
                /// 本地日期时间被修改消息
                [[NSNotificationCenter defaultCenter] postNotificationName:PDALocalDateTimeChangeNotification object:nil userInfo:nil];
            }

如何处理?

- (void)LocalDateTimeChange:(NSNotification *)notifacation {
    /// 弹窗提示,并退出程序
    UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"本地日期时间被修改" message:@"本地时间和服务器时间误差超过5分钟,请退出调整时间设置" preferredStyle:UIAlertControllerStyleAlert];
    [alert addAction:[UIAlertAction actionWithTitle:@"知道了" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
        exit(0);
    }]];
    
    [self presentViewController:alert animated:YES completion:nil];
}
上一篇 下一篇

猜你喜欢

热点阅读