You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在MacOS上获取更新的时区标识符(Objective-C实现)

MacOS下通过Objective-C获取自动更新时区标识符(Go调用示例)

1. Objective-C实现代码

创建tzhelper.m文件,内容如下:

#import <Foundation/Foundation.h>

// 暴露给Go调用的C风格函数
const char* GetAutoUpdatingTimeZoneIdentifier() {
    // 获取自动更新的当前时区对象
    NSTimeZone *autoTZ = [NSTimeZone autoupdatingCurrentTimeZone];
    // 获取时区标识符字符串
    NSString *identifier = [autoTZ identifier];
    // 将NSString转为C字符串,返回拷贝后的内容(避免原对象释放后指针失效)
    return strdup([identifier UTF8String]);
}

// 用于释放返回的C字符串,避免内存泄漏
void FreeTimeZoneIdentifier(const char* str) {
    free((void*)str);
}

2. Go调用代码示例

在Go文件中通过cgo调用上述函数:

package main

/*
#cgo LDFLAGS: -framework Foundation
#include "tzhelper.m"
*/
import "C"
import "fmt"
import "unsafe"

func main() {
    // 调用Objective-C实现的函数获取时区标识符
    cStr := C.GetAutoUpdatingTimeZoneIdentifier()
    defer C.FreeTimeZoneIdentifier(cStr) // 记得释放内存
    
    // 转为Go字符串
    tzID := C.GoString(cStr)
    fmt.Println("自动更新的时区标识符:", tzID)
}

关键说明

  • Swift里的autoupdatingCurrent属性,在Objective-C中对应的调用是类方法[NSTimeZone autoupdatingCurrentTimeZone]
  • 必须用strdup拷贝C字符串,因为UTF8String返回的指针属于NSString内部存储,对象释放后指针会失效
  • 通过#cgo LDFLAGS: -framework Foundation指定编译时链接Foundation框架,这是调用系统API的必要条件
  • 一定要调用FreeTimeZoneIdentifier释放内存,避免长期运行出现内存泄漏

内容的提问来源于stack exchange,提问作者kortschak

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 21:49:51