首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

Objective-C 時間戳與 NSDate 互轉完整指南

     編輯:關於C語言

時間戳基礎概念

時間戳(Timestamp)通常指從 1970年1月1日 00:00:00 UTC(Unix 紀元)到當前時刻的總秒數或毫秒數。iOS/macOS 中 NSTimeInterval 以秒為單位的 double 表示。

時間戳 → NSDate

NSString *timestampStr = @"1283376197"; // 秒級字符串
NSTimeInterval timeInterval = [timestampStr doubleValue];
NSDate *date = [NSDate dateWithTimeIntervalSince1970:timeInterval];
NSLog(@"Date: %@", date); // 輸出 GMT 時間

若為毫秒級時間戳(13位),需除以 1000.0:

long long ms = 1283376197000;
NSDate *date = [NSDate dateWithTimeIntervalSince1970:ms / 1000.0];

NSDate → 時間戳

NSDate *now = [NSDate date]; // 當前時間
NSTimeInterval interval = [now timeIntervalSince1970]; // 秒級 double
NSString *timestamp = [NSString stringWithFormat:@"%.0f", interval]; // 秒級字符串
// 毫秒級
NSString *msTimestamp = [NSString stringWithFormat:@"%.0f", interval * 1000];

原文中的時區轉換代碼(NSTimeZone 調整)實際上是多餘的,timeIntervalSince1970 已經返回 UTC 基準的秒數,無需手動時區修正。

NSDate 格式化輸出

NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"yyyy年MM月dd日 HH:mm:ss"]; // 自定義格式
formatter.timeZone = [NSTimeZone systemTimeZone]; // 顯示本地時間
NSString *dateStr = [formatter stringFromDate:date];
NSLog(@"Formatted: %@", dateStr);

常用格式符號

符號含義示例
yyyy年(4位)2024
MM月(2位)01-12
dd日(2位)01-31
HH時(24制)00-23
mm分00-59
ss秒00-59
SSS毫秒000-999

字符串 → NSDate 解析

NSDateFormatter *parser = [[NSDateFormatter alloc] init];
[parser setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
[parser setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"UTC"]]; // 指定輸入時區
NSDate *parsedDate = [parser dateFromString:@"2024-01-15 14:30:00"];

實用工具類封裝

// DateUtils.h
@interface DateUtils : NSObject
+ (NSString *)timestampFromDate:(NSDate *)date milliseconds:(BOOL)ms;
+ (NSDate *)dateFromTimestamp:(NSString *)timestamp milliseconds:(BOOL)ms;
+ (NSString *)stringFromDate:(NSDate *)date format:(NSString *)fmt;
@end

// DateUtils.m
@implementation DateUtils
+ (NSString *)timestampFromDate:(NSDate *)date milliseconds:(BOOL)ms {
    NSTimeInterval ti = [date timeIntervalSince1970];
    return ms ? [NSString stringWithFormat:@"%.0f", ti * 1000] : [NSString stringWithFormat:@"%.0f", ti];
}
+ (NSDate *)dateFromTimestamp:(NSString *)timestamp milliseconds:(BOOL)ms {
    NSTimeInterval ti = [timestamp doubleValue];
    if (ms) ti /= 1000.0;
    return [NSDate dateWithTimeIntervalSince1970:ti];
}
+ (NSString *)stringFromDate:(NSDate *)date format:(NSString *)fmt {
    NSDateFormatter *f = [[NSDateFormatter alloc] init];
    f.dateFormat = fmt;
    f.timeZone = [NSTimeZone systemTimeZone];
    return [f stringFromDate:date];
}
@end

避坑指南

  • 時區陷阱:NSDate 內部存儲 UTC,顯示時才按時區格式化。存儲/傳輸用時間戳或 ISO8601 字符串(yyyy-MM-dd'T'HH:mm:ssZ)。
  • 精度丟失:NSTimeInterval 是 double,秒級精度約 15-16 位有效數字,毫秒級足夠,納秒級會丟失精度。
  • 格式化效能:NSDateFormatter 創建開銷大,高頻調用時應緩存實例或使用靜態單例。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved