欢迎各位兄弟 发布技术文章
这里的技术是共享的
我自己亲自做的,见: /node-admin/23177 # OK 有大用 有大大用
MAC 12 更改时区 修改时区 :sudo systemsetup -settimezone Asia/Shanghai
在 macOS Monterey(12.x)中更改时区可以通过以下步骤完成:
打开系统偏好设置
点击屏幕左上角的 苹果菜单(🍎) > 系统偏好设置。
或通过 Dock 中的“系统偏好设置”图标进入。
进入“日期与时间”
找到并点击 “日期与时间”(图标显示为日历和时钟)。
解锁设置
点击窗口左下角的 🔒 锁形图标,输入管理员密码解锁。
更改时区
点击顶部 “时区” 标签。
在地图上点击你的位置,或在搜索框输入城市名(如 Shanghai
、New York
)。
或从下拉菜单中选择最近的地区。
勾选 “自动设置时区”(依赖网络定位),或手动选择:
保存设置
关闭窗口即可自动生效。
打开 终端(应用程序 > 实用工具 > 终端)。
输入以下命令查看当前时区:
bashsudo systemsetup -gettimezone
列出所有可用时区(如需要):
bashsudo systemsetup -listtimezones
更改时区(例如设为上海时区): # OK 有大用
bashsudo defaults write /Library/Preferences/com.apple.timezone.auto Active -bool false
sudo systemsetup -setusingnetworktime off
sudo systemsetup -settimezone Asia/Shanghai
需输入管理员密码。
# sudo systemsetup -settimezone Asia/Shanghai
Password:
2025-10-08 15:31:13.864 systemsetup[1725:132221] ### Error:-99 File:/AppleInternal/Library/BuildRoots/a0876c02-1788-11ed-b9c4-96898e02b808/Library/Caches/com.apple.xbs/Sources/Admin/InternetServices.m Line:379
Set TimeZone: Asia/Shanghai
虽然报 Error:-99 的错,但是 事实上 修改时区是成功了
自动同步:如果勾选了“自动设置时区”,Mac 会通过网络定位自动调整时区(需联网)。
时间同步问题:更改时区后,确保时间与服务器同步(在“日期与时间”设置中勾选 “自动设置日期与时间”)。
管理员权限:手动修改时需要管理员密码。
如果遇到问题,可以尝试重启系统或检查是否有 macOS 更新未安装。
MAC 13 更改时区 修改时区 :
非常好的观察 👍
你说得对 —— 在 macOS 13.5 (Ventura) 及之后的版本里,Apple 移除了旧版“地图选择时区”界面,改成了一个更简化的界面,默认只能显示“自动设置时区”,没有地图按钮。 但你仍然可以通过以下几种方式手动更改时区 👇
打开 系统设置 (System Settings)
进入:通用 (General) → 日期与时间 (Date & Time)
找到 “设置时区自动使用当前位置 (Set time zone automatically using your current location)”
关闭这个选项
然后你会看到一个 下拉菜单或搜索栏(而不是地图)出现
在里面输入城市名称(例如 “Shanghai” 或 “Beijing”)
选择对应的城市
✅ 完成后,时区会立即更新。
打开 终端 (Terminal)
查看当前时区:
查看所有可用时区:
这会列出几十个,如:
设置中国时区:
sudo systemsetup -setusingnetworktime off
验证:
输出应类似:
如果命令行被限制,也可以直接链接 /etc/localtime
:
然后再执行:
确认时间是否正确。
要不要我帮你写一个小脚本,比如一条命令自动:
设置时区为上海;
同步网络时间;
输出确认信息?
AG
sudo defaults write /Library/Preferences/com.apple.timezone.auto Active -bool false
sudo systemsetup -setusingnetworktime off
sudo systemsetup -settimezone Asia/Shanghai
详解
你提供的命令组合用于 手动强制设置 macOS 的时区,并禁用自动时区同步功能。以下是逐条详解:
bashsudo defaults write /Library/Preferences/com.apple.timezone.auto Active -bool false
功能:
通过修改系统配置文件,强制关闭 macOS 的自动时区同步功能(即使图形界面中勾选了“自动设置时区”也会失效)。
路径:/Library/Preferences/com.apple.timezone.auto
是系统级配置,存储自动时区开关状态。
注意:
此操作需重启或重启相关服务生效。
bashsudo systemsetup -setusingnetworktime off
功能:
禁用 macOS 与苹果时间服务器(如 time.apple.com
)的自动时间同步。
影响:
系统时间将不再自动校准,可能因硬件时钟误差逐渐偏移。
bashsudo systemsetup -settimezone Asia/Shanghai
功能:
强制将时区设置为 Asia/Shanghai
(上海时区,UTC+8)。
依赖:
需要确保时区名称在系统中有效(可通过 sudo systemsetup -listtimezones
查看列表)。
企业/学校环境:需要统一固定时区,避免设备因地理位置变动自动切换时区。
调试或开发:测试不同时区下的软件行为,需确保时区不被系统自动修改。
解决冲突:当自动时区功能异常(如 GPS/网络定位失败)时手动修复。
时间不同步风险:
关闭网络时间同步后,系统时间可能逐渐不准(依赖硬件时钟精度)。
建议定期手动同步时间(如 sudo ntpdate time.apple.com
)。
权限问题:
所有命令需 sudo
权限,输入密码时确保当前账户是管理员。
系统版本差异:
macOS Ventura(13.x)及以上版本对 systemsetup
命令的限制可能更严格,推荐优先使用图形界面(系统设置 > 通用 > 日期与时间
)。
配置文件恢复:
若需重新启用自动时区,执行:
bashsudo defaults write /Library/Preferences/com.apple.timezone.auto Active -bool true sudo systemsetup -setusingnetworktime on
检查时区:
bashdate +"%Z %z" # 输出应为 "CST +0800"(上海时区)
检查自动同步状态:
bashsudo systemsetup -getusingnetworktime # 应返回 "Network Time: Off" sudo defaults read /Library/Preferences/com.apple.timezone.auto Active # 应返回 "0"(false)
如果目标是稳定设置时区而非完全禁用自动化,建议:
图形界面操作:
进入 系统设置 > 通用 > 日期与时间
→ 关闭 “自动设置时区” → 手动选择时区。
仅用终端命令:
bashsudo timedatectl set-timezone Asia/Shanghai # macOS 13+ 推荐
你的命令组合是一种强制手段,适用于特殊需求场景。但日常使用中,直接通过图形界面或 timedatectl
命令更安全可靠。若遇到 Error -99
,仍需检查系统完整性或尝试重启服务。
chatgpt
sudo defaults write /Library/Preferences/com.apple.timezone.auto Active -bool false
sudo systemsetup -setusingnetworktime off
sudo systemsetup -settimezone Asia/Shanghai
详解
下面把你贴出的三条命令逐条详解,并补充常见问题、验证方法、回滚(还原)和替代方案 —— 读完你就能清楚每条命令在做什么、为什么要这么做,以及遇到 Error:-99
/ 权限限制时该怎么办。
三条命令的目的:
关闭“自动根据位置设置时区”的系统偏好(把“自动设置时区”切掉),
关闭网络时间(NTP),
手动把系统时区设置为 Asia/Shanghai
(北京时间)。
组合起来就是把 macOS 从“自动 / 网络驱动”的时间/时区模式切换为“手动 / 固定为上海时区”。
sudo defaults write /Library/Preferences/com.apple.timezone.auto Active -bool false
作用:用 defaults
写入系统级偏好(位于 /Library/Preferences
)的 com.apple.timezone.auto
域,把 Active
这个键设为 false
(即关闭“自动根据当前位置设置时区”)。
为什么要做:如果不先关闭自动时区,系统的位置服务可能会立刻把时区改回自动值;先把自动功能关掉,手动设置时区才更可靠。
实现机制:defaults
实际上是修改或创建一个 plist 文件(/Library/Preferences/com.apple.timezone.auto.plist
),写入布尔值 Active = 0
。
权限:写入 /Library/Preferences
需要 root 权限,所以用 sudo
。
验证:
sudo defaults read /Library/Preferences/com.apple.timezone.auto
预期看到 Active = 0
或类似输出。
在图形界面:系统设置 → 通用 → 日期与时间,确认“自动设置时区/根据当前位置”已关闭(有时设置界面会覆盖这个值)。
注意:
在企业/MDM 管理的机器上,这个值可能被策略(MDM)重写;如果是受管理设备,先确认策略设置。
改完后可能需要登出/重启或重启位置服务才会立刻生效(见下面“使更改生效”的说明)。
sudo systemsetup -setusingnetworktime off
作用:使用 macOS 的 systemsetup
工具把“使用网络时间(NTP)”功能关掉。
为什么要做:NTP 同步只负责校正系统时间(clock),并不直接修改时区,但在某些情况下同时启用 NTP 和自动时区或系统策略会造成设置冲突。关闭 NTP 可以避免因自动校时/策略导致的干扰(尤其在调试时区问题时)。
验证:
systemsetup -getusingnetworktime
→ 应返回 Network Time: Off
(或类似)。
注意:
关闭 NTP 会让系统时间不再自动与网络时间服务器同步,长期不推荐(除非你有其它 NTP 管理手段)。完成时区设置后,可以再次开启 systemsetup -setusingnetworktime on
。
需要管理员权限(故使用 sudo
)。
sudo systemsetup -settimezone Asia/Shanghai
作用:告诉系统把时区设置为 Asia/Shanghai
。
如何确认可用时区名称:先用 systemsetup -listtimezones
查到正确的时区字符串(必须精确匹配其中的某一项)。
验证:
systemsetup -gettimezone
→ 应显示 Time Zone: Asia/Shanghai
(或类似)。
date
→ 应显示带 CST
(中国标准时间)或北京时间偏移的时间,比如 Tue Oct 7 19:08:05 CST 2025
。
ls -l /etc/localtime
→ (在多数 Unix/macOS 系统上)会指向相应的 zoneinfo 文件 /usr/share/zoneinfo/Asia/Shanghai
(见下替代方法)。
常见问题(你已经遇到的):
Error:-99
(像你之前看到的)是常见的内部 API / 权限/受保护接口失败的提示:表面上 systemsetup
返回成功信息,但底层写入可能被 sandbox/SIP/TCC 或苹果内部 API 限制而失败 —— 常见于 Ventura(13.x)及以后版本或受管理设备。
替代方法(当 systemsetup
失败时):
直接替换 /etc/localtime
(Unix 通常读取它决定时区):
然后 date
查看时间是否为北京时间。这个方法在多数情况能生效(但并非苹果官方“首选”接口)。
如果系统仍然被“自动时区”或管理策略覆盖,可能需要禁用对应服务或在 MDM 控制台修改策略。
有时写入偏好后需要让相关守护进程重读配置:
sudo killall -HUP locationd
(重启位置服务,让自动时区设置生效/失效)
sudo killall -HUP systemsetup
—— 注意:部分守护进程名字可能不同;killall 会自动重启对应守护进程。
这些命令会让服务重新加载配置,但使用前注意当前会话的影响(短暂的服务重启通常是安全的)。
如果不放心,重启机器最稳妥(简单粗暴但可靠)。
恢复自动时区:
或删除自定义键:
重新开启网络时间(NTP):
若你用了 ln -sf
修改了 /etc/localtime
,可以用 sudo rm /etc/localtime
然后再用 systemsetup -settimezone
或重启让系统恢复标准管理流程。
仍被自动改回:检查是否开启了“根据当前位置自动设置时区”,或是否由 MDM/配置描述文件强制设置(用 profiles
/ MDM 控制台检查)。
Error:-99 仍出现:说明 systemsetup
接口被受限,试替代 ln -sf
方法或在图形界面手动设置。
时钟不对(时间而不是时区):确认 NTP 是否开启并正确设置 NTP 服务器。
权限问题:确保你有管理员权限且用 sudo
运行;某些文件受 SIP(System Integrity Protection)保护,无法修改(但 /Library/Preferences
通常可写入)。
下面脚本做:关闭自动时区、关闭网络时间、设置时区、并显示验证信息(在受管理的设备上请先确认不会与策略冲突):
使用方法:把上面保存为 set-shanghai-tz.sh
,然后 chmod +x set-shanghai-tz.sh
、sudo ./set-shanghai-tz.sh
。
defaults write ... Active -bool false
:关掉“自动时区”偏好(location-based)。
systemsetup -setusingnetworktime off
:关掉 NTP(网络时间)。
systemsetup -settimezone Asia/Shanghai
:设置时区(失败时可用 ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
作替代)。
若机器受 MDM 管理或 macOS 新版的权限限制(SIP / TCC),某些命令会被覆盖或报错(如 Error:-99
),需用替代方法或调整管理策略。
如果你愿意,我可以:
把上面脚本调整成更“守稳”的版本(例如先检测是否受 MDM 管理并提示),或者
帮你分析你那台机器的实际输出(把 systemsetup -gettimezone
、systemsetup -getusingnetworktime
、sudo defaults read /Library/Preferences/com.apple.timezone.auto
的结果发过来),我可以基于输出给出精确建议。要哪个我直接做哪个。
sudo ln -sf /usr/share/zoneinfo/America/Los_Angeles /etc/localtime
与
sudo systemsetup -settimezone "America/Los_Angeles"
区别
这两个命令都用于设置系统的时区为 America/Los_Angeles
(美国洛杉矶时间),但它们的实现方式和适用场景有所不同:
sudo ln -sf /usr/share/zoneinfo/America/Los_Angeles /etc/localtime
作用:直接通过符号链接将 /etc/localtime
文件指向时区数据库中的 Los_Angeles
文件。
原理:
/usr/share/zoneinfo/
是系统存放时区信息的目录。
/etc/localtime
是系统读取当前时区的配置文件(通常是一个符号链接)。
通过 ln -sf
强制覆盖链接,直接修改时区。
特点:
底层操作:直接操作文件系统,不依赖特定工具。
跨平台性:适用于大多数 Linux 发行版和 Unix-like 系统(如 FreeBSD)。
无依赖:不需要额外的命令行工具。
注意:
某些系统(如现代 systemd 管理的 Linux)可能要求同步运行 timedatectl set-timezone
以更新其他配置。
sudo systemsetup -settimezone "America/Los_Angeles"
作用:通过 macOS 专用工具 systemsetup
设置时区。
原理:
systemsetup
是 macOS 提供的系统配置工具,用于管理网络、时间、睡眠等全局设置。
该命令会修改 /etc/localtime
,但通过更高层的接口实现(可能还会触发其他系统服务更新)。
特点:
macOS 专用:仅适用于 macOS 系统。
上层封装:相比直接操作文件,更“官方”且可能包含额外逻辑(如日志记录)。
功能丰富:systemsetup
还支持其他系统设置(如日期、网络时间同步等)。
注意:
在 Linux 或其他系统中通常不可用。
特性 | ln -sf 方法 | systemsetup 方法 |
---|---|---|
适用系统 | Linux/Unix(通用) | 仅 macOS |
底层 vs 高层 | 直接修改文件 | 通过系统工具封装 |
依赖项 | 无 | 需要 macOS 的 systemsetup 工具 |
扩展性 | 需手动处理其他配置(如 systemd 同步) | 可能自动触发相关服务更新 |
Linux/Unix 系统:优先使用 ln -sf
或 timedatectl set-timezone
(若可用)。
macOS 系统:建议用 systemsetup
(兼容性更佳,避免意外问题)。
现代 Linux 发行版(如 Ubuntu/CentOS)还可通过 timedatectl
管理时区:
bashsudo timedatectl set-timezone America/Los_Angeles