iOS小技能:自定义时间格式(适配iOS15.4之后12/24小时制的问题)

您所在的位置:网站首页 miui24小时制设置 iOS小技能:自定义时间格式(适配iOS15.4之后12/24小时制的问题)

iOS小技能:自定义时间格式(适配iOS15.4之后12/24小时制的问题)

2023-07-07 14:42| 来源: 网络整理| 查看: 265

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第17天,点击查看活动详情

引言

系统自带样式

格式日期时间NSDateFormatterNoStyle""""NSDateFormatterShortStyle2022/7/31上午11:40NSDateFormatterMediumStyle2022年7月31日上午11:40:29NSDateFormatterLongStyle2022年7月31日GMT+8 上午11:40:49NSDateFormatterFullStyle2022年7月31日 星期三中国标准时间 上午11:41:16

自定义格式

案例1: 小程序订单小票

在这里插入图片描述

案例2:订单详情时间格式化

在这里插入图片描述

I 自定义格式

HH:表示24小时制 hh: 表示12小时制

GGG: 公元时代,例如AD公元 yy: 年的后2位 yyyy: 完整年 MM: 月,显示为1-12 MMM: 月,显示为英文月份简写,如 Jan MMMM: 月,显示为英文月份全称,如 Janualy dd: 日,2位数表示,如02 d: 日,1-2位显示,如 2 EEE: 简写星期几,如Sun EEEE: 全写星期几,如Sunday aa: 上下午,AM/PM H: 时,24小时制,0-23 h:时,12小时制,0-11 m: 分,1-2位 mm: 分,2位 s: 秒,1-2位 ss: 秒,2位 S:毫秒 zzz:三位字符串表示“时区”(例如GMT)。缩写 Z 复制代码 1.1 小程序订单小票

需求:小程序订单打印模板优化,头部增加配送订单、自提订单;自提订单增加显示自提时间,配送订单无需显示。

在这里插入图片描述

订单接口数据格式:

"selfMentionEndTime" : "2022-05-18 10:08:03", "selfMentionStartTime" : "2022-05-18 10:08:03", 复制代码

实现:

if(detaiModel.deliveryMethod.intValue == QCTOrderdeliveryMethod4To_the_shop_self_mention){//自提 [command addSetJustification:0];// * @param n 左 中 右对齐,0左对齐,1中间对齐,2右对齐 [command addPrintMode: 0x0]; //自提时间 YY- MM- DD hh:mm - hh:mm NSString *start = detaiModel.delivery.selfMentionStartTime; // 时间格式化 start = [QCT_Common strdatedateFormat:@"yyyy-MM-dd HH:mm" fromDateFormat:@"yyyy-MM-dd HH:mm:ss" objstr:start]; NSString *end = detaiModel.delivery.selfMentionEndTime; end = [QCT_Common strdatedateFormat:@"HH:mm" fromDateFormat:@"yyyy-MM-dd HH:mm:ss" objstr:end]; [command addText:[NSString stringWithFormat:@"提货时间:%@-%@\n",start,end]]; [command addPrintAndLineFeed]; } 复制代码 1.2 订单详情时间格式化 20210330105712->2021-03-30 10:57:12

在这里插入图片描述 同理2020年01月01日转成2020-01-01 ,可利用NSDateFormatter先把2020年01月01日字符串转NSDate,再把NSDate转成2020-01-01 字符串

payinfomodel.createTime = [QCT_Common strdatedateFormat:@"yyyy-MM-dd HH:mm:ss" fromDateFormat:@"yyyyMMddHHmmss" objstr:refund_time_];// 格式化时间戳 复制代码 1.3 代码实现 + (NSString *)strdatedateFormat:(NSString*)toDateFormat fromDateFormat:(NSString *)fromDateFormat objstr:(NSString*)objstr{ NSString *tmpbirthday = @""; if(![NSStringQCTtoll isBlankString:objstr]){ tmpbirthday = objstr; tmpbirthday = [QCT_Common date4ateFormat:toDateFormat withdate:[QCT_Common dateWithFormatterString:tmpbirthday dateFormat:fromDateFormat]]; } return tmpbirthday; } + (NSString *)date4ateFormat:(NSString *)DateFormat withdate:(NSDate *)date{ NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; // [formatter setDateStyle:NSDateFormatterMediumStyle]; // [formatter setTimeStyle:NSDateFormatterShortStyle]; [formatter setDateFormat:DateFormat]; return [formatter stringFromDate:date]; } + (NSDate*)dateWithFormatterString:(NSString*)dateWithString dateFormat:(NSString*)dateFormat { NSDateFormatter *dateFormatter = [[NSDateFormatter alloc]init]; dateFormatter.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"zh_CN"]; dateFormatter.dateFormat = dateFormat; NSDate *date = [dateFormatter dateFromString:dateWithString]; return date; } 复制代码 II iOS15.4之后12/24小时制的问题 2.1 问题

问题:如果没有设置locale和NSCalendarIdentifierISO8601,即使指定格式化指定了24小时制,也会跟随系统设置显示。

在这里插入图片描述

2.2 适配

解决方式:自定义时间格式的时候,指定locale和NSCalendarIdentifierISO8601。

在这里插入图片描述

+ (NSString *)date:(NSDate *)date{ NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; // [formatter setDateStyle:NSDateFormatterMediumStyle]; // [formatter setTimeStyle:NSDateFormatterShortStyle];// 自带的样式 [formatter setDateFormat:@"yyyy-MM-dd HH:mm"]; // 指定local,真机调试,转换时间 需要设置 NSLocale NSLocale *zh_CNLocale = [[NSLocale alloc] initWithLocaleIdentifier:@"zh_CN"];//zh_CN en_US en_GB zh_Hans_CN formatter.locale =zh_CNLocale; formatter.calendar = [[NSCalendar alloc]initWithCalendarIdentifier:NSCalendarIdentifierISO8601]; formatter.timeZone = [NSTimeZone timeZoneWithName:@"Asia/Shanghai"];//东八区时间 //这样不管我们的手机是在哪里,打印出来的时间都是东八区的时间 // formatter.timeZone = [NSTimeZone timeZoneWithName:@"Asia/Tokyo"];//东九区时间 // formatter.timeZone = [NSTimeZone timeZoneWithName:@"GMT"];//零区时间 // formatter.timeZone = [NSTimeZone timeZoneWithName:@"UTC"];//零区时间,和GMT一样 // return [formatter stringFromDate:date]; NSString *tmpdate= [formatter stringFromDate:date]; tmpdate = [tmpdate stringByReplacingOccurrencesOfString:@"下午" withString:@""]; tmpdate = [tmpdate stringByReplacingOccurrencesOfString:@"上午" withString:@""]; return tmpdate; 复制代码 2.3 小结

养成指定locale的好习惯

+ (NSDateFormatter*)getzh_CNLocale{ NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; NSLocale *zh_CNLocale = [[NSLocale alloc] initWithLocaleIdentifier:@"zh_CN"];//zh_CN en_US en_GB zh_Hans_CN formatter.locale =zh_CNLocale; formatter.calendar = [[NSCalendar alloc]initWithCalendarIdentifier:NSCalendarIdentifierISO8601]; formatter.timeZone = [NSTimeZone timeZoneWithName:@"Asia/Shanghai"];//东八区时间 //这样不管我们的手机是在哪里,打印出来的时间都是东八区的时间 return formatter; } 复制代码 see alos

公众号:iOS逆向



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3