iOS时间戳与北京时间的转换

iOS时间处理技巧
本文介绍如何使用NSDateFormatter在iOS开发中进行日期时间的格式化处理,包括将字符串转换为NSDate对象,获取当前时间戳,以及将NSDate对象转换为特定格式的字符串。
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateStyle:NSDateFormatterFullStyle];// 修改下面提到的北京时间的日期格式
[formatter setTimeStyle:NSDateFormatterFullStyle];// 修改下面提到的北京时间的时间格式
[formatter setDateFormat:@"YYYY-MM-dd HH:mm:ss SSS"];// 此行代码与上面两行作用一样,故上面两行代码失效

// 北京时间2016-06-28 13:20:00 000(可以把北京时间字符串转成北京时间戳、格林尼治时间)
NSString *timeStr = @"2016-06-28 13:20:00 000";
NSDate *date = [formatter dateFromString:timeStr];
NSLog(@"%@", date);// 这个时间是格林尼治时间
NSString *dateStr = [NSString stringWithFormat:@"%ld", (long)[date timeIntervalSince1970]];
NSLog(@"%@", dateStr);// 这个时间是北京时间戳

// 当前北京时间2016-06-28 13:**:** ***(可以获取当前北京时间、当前格林尼治时间、当前北京时间戳)
NSDate *datenow = [NSDate date];
NSLog(@"%@", datenow);// 这个时间是格林尼治时间
NSString *dateString = [NSString stringWithFormat:@"%ld", (long)[datenow timeIntervalSince1970]];
NSLog(@"%@", dateString);// 这个时间是北京时间戳
NSString *nowtimeStr = [formatter stringFromDate:datenow];
NSLog(@"%@", nowtimeStr);// 这个时间是北京时间

// 北京时间戳1500000000(可以把北京时间戳转成北京时间、格林尼治时间)
NSDate *date1 = [NSDate dateWithTimeIntervalSince1970:1500000000];
NSLog(@"%@",date1);// 这个时间是格林尼治时间
NSString *dat = [formatter stringFromDate:date1];
NSLog(@"%@", dat);// 这个时间是北京时间


// 从上面可以总结规律:NSDate类型为格林尼治时间,通过formatter转换成NSString类型就是北京时间
// 换言之,只要是时间戳和格林尼治时间转换就不需要formatter,而只要涉及到北京时间,则需要通过formatter转换
// 实际应用中,肯定不希望是格林尼治时间,故肯定会用到formatter。

下面是输出结果

2016-06-28 13:57:12.520 time[34540:11198995] 2016-06-28 05:20:00 +0000

2016-06-28 13:57:12.521 time[34540:11198995] 1467091200

2016-06-28 13:57:12.521 time[34540:11198995] 2016-06-28 05:57:12 +0000

2016-06-28 13:57:12.521 time[34540:11198995] 1467093432

2016-06-28 13:57:12.521 time[34540:11198995] 2016-06-28 13:57:12 521

2016-06-28 13:57:12.521 time[34540:11198995] 2017-07-14 02:40:00 +0000

2016-06-28 13:57:12.521 time[34540:11198995] 2017-07-14 10:40:00 000



<think>好的,用户想封装一个将时间转换时间戳的JavaScript函数。我需要参考之前的回答和用户提供的引用,确保满足他们的需求。首先,用户之前的问题是关于时间戳和日期转换的封装,现在他们想反过来,把时间时间戳。之前的回答中已经有一个dateToTimestamp函数,但可能需要改进。用户提供的引用[1]提到函数可以接收10或13位时间戳,并返回包含各种格式的对象,而引用[2]则展示了多种日期格式的转换。不过用户现在需要的是将日期字符串转换时间戳,可能还需要处理不同格式的输入。用户可能希望函数灵活处理不同日期格式,比如带不带时分秒,是否有时区信息。例如,用户提到的引用[1]中的函数处理了iOS兼容性问题,用T替换空格并加Z。但用户的问题里提到如何处理包含时区偏移的字符串,比如2024-05-30T00:00:00+08:00,这需要解析带时区的字符串。 另外,用户可能关心浏览器兼容性,特别是iOS对日期格式的严格要求。之前的回答中提到替换空格为T并加Z,这可能是为了解决iOS的问题。但是,如果输入字符串本身包含时区信息,比如+08:00,直接替换可能会出错。需要处理这种情况,可能需要不同的解析方式。 函数需要支持返回秒级或毫秒级时间戳,如用户之前的示例所示。此外,异常处理也很重要,比如无效日期输入时抛出错误,如引用中的dateToTimestamp函数所做的。 现在,我需要设计一个更健壮的日期时间戳函数。需要考虑以下几点: 1.输入日期字符串的格式多样性,如YYYY-MM-DD、YYYY/MM/DD HH:mm:ss等。2.处理时区偏移,如+08:00或Z。 3. iOS兼容性问题,可能需要将空格替换为T并添加时区信息。 4.自动判断是否需要转换为UTC时间或本地时间。 5.返回秒级或毫秒级时间戳。 可能的解决方案是使用Date.parse方法,但不同浏览器对日期字符串的解析存在差异。例如,Safari不支持YYYY-MM-DD HH:mm:ss格式,需要转换为ISO格式,如YYYY-MM-DDTHH:mm:ss。因此,函数内部需要将输入的日期字符串转换为浏览器兼容的ISO格式。例如,替换空格为T,并添加时区信息如果不存在的话。对于包含时区的情况,保留原有时区信息,否则默认按本地时间或指定时区处理。 此外,用户可能希望函数可以指定是否返回UTC时间戳。例如,是否根据输入字符串的时区转换为UTC时间戳,或者保持本地时间。这可能需要添加一个参数来控制。综上,封装函数需要处理不同格式的日期字符串,转换为兼容的ISO格式,然后生成时间戳。同时提供选项返回秒或毫秒级,并处理时区问题。</think>### JavaScript日期时间戳的封装方法 根据需求提供两种高复用性实现方案,支持多种日期格式解析和时区处理: #### 基础版(兼容常见格式) ```javascript /** * 日期时间戳(自动处理格式兼容) * @param {string} dateStr - 日期字符串(支持格式:YYYY-MM-DD[ HH:mm:ss]、YYYY/MM/DD等) * @param {boolean} [toSecond=true] - 是否返回秒级时间戳 * @param {boolean} [isUTC=false] - 是否按UTC时间解析 * @returns {number} 时间戳 */ function dateToTimestamp(dateStr, toSecond = true, isUTC = false) { // 格式标准化处理 let isoStr = dateStr .replace(/\//g, '-') // 统一分隔符 .replace(/(\d{4}-\d{2}-\d{2})([\sT])(\d{2}:\d{2}:\d{2})/, '$1T$3') // 兼容空格分隔符 .padEnd(19, 'T00:00:00'); // 补全时间部分 // 处理时区标识 if (!/[+-]\d{2}:?\d{2}$/.test(isoStr)) { isoStr += isUTC ? 'Z' : ''; // 自动添加时区标识[^1] } const timestamp = Date.parse(isoStr); if (isNaN(timestamp)) throw new Error('无效的日期格式'); return toSecond ? Math.floor(timestamp / 1000) : timestamp; } ``` #### 增强版(支持时区偏移) ```javascript /** * 高级日期时间戳(支持时区偏移) * @param {string} dateStr - 日期字符串(支持ISO 8601格式) * @param {boolean} [toSecond=true] - 返回秒级时间戳 * @param {string} [targetTimezone] - 目标时区(如'+08:00') * @returns {number} 时间戳 */ function advancedDateToTimestamp(dateStr, toSecond = true, targetTimezone) { // 解析带时区的日期 const date = new Date(dateStr); // 时区转换处理 if (targetTimezone) { const offset = targetTimezone === 'Z' ? 0 : parseInt(targetTimezone.slice(1,3)) * 60 + parseInt(targetTimezone.slice(4,6)) || 0; const timezoneOffset = targetTimezone.startsWith('-') ? -offset : offset; date.setMinutes(date.getMinutes() - date.getTimezoneOffset() + timezoneOffset); } const timestamp = date.getTime(); return toSecond ? Math.floor(timestamp / 1000) : timestamp; } ``` **使用示例**: ```javascript // 基础版 console.log(dateToTimestamp('2024-05-30')); // 输出:1717027200(秒级) console.log(dateToTimestamp('2024/05/30 08:00')); // 输出:1717027200(自动补全时间) // 增强版(带时区转换) console.log(advancedDateToTimestamp('2024-05-30T00:00:00+09:00', true, '+08:00')); // 输出:1717027200(将东京时间转换北京时间后的时间戳) ``` --- ### 核心特性说明 1. **格式自动识别**:支持`YYYY-MM-DD HH:mm:ss`、`YYYY/MM/DD`等常见格式[^2] 2. **时区控制**: - 基础版通过`isUTC`参数控制UTC时间解析 - 增强版支持任意时区转换(如`+08:00`) 3. **兼容性处理**: - 统一替换分隔符为ISO标准格式 - 自动补全缺失的时间部分(默认00:00:00) 4. **错误处理**:检测无效日期并抛出异常 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值