···14 time = {
1516 timeZone = mkOption {
17- default = "UTC";
18- type = types.str;
19 example = "America/New_York";
20 description = ''
21 The time zone used when displaying times and dates. See <link
22 xlink:href="https://en.wikipedia.org/wiki/List_of_tz_database_time_zones"/>
23 for a comprehensive list of possible values for this setting.
00024 '';
25 };
26···40 # This way services are restarted when tzdata changes.
41 systemd.globalEnvironment.TZDIR = tzdir;
4243- environment.etc.localtime =
44- { source = "/etc/zoneinfo/${config.time.timeZone}";
45- mode = "direct-symlink";
000046 };
47-48- environment.etc.zoneinfo.source = tzdir;
49-50 };
5152}
···14 time = {
1516 timeZone = mkOption {
17+ default = null;
18+ type = types.nullOr types.str;
19 example = "America/New_York";
20 description = ''
21 The time zone used when displaying times and dates. See <link
22 xlink:href="https://en.wikipedia.org/wiki/List_of_tz_database_time_zones"/>
23 for a comprehensive list of possible values for this setting.
24+25+ If null, the timezone will default to UTC and can be set imperatively
26+ using timedatectl.
27 '';
28 };
29···43 # This way services are restarted when tzdata changes.
44 systemd.globalEnvironment.TZDIR = tzdir;
4546+ systemd.services.systemd-timedated.environment = lib.optionalAttrs (config.time.timeZone != null) { NIXOS_STATIC_TIMEZONE = "1"; };
47+48+ environment.etc = {
49+ zoneinfo.source = tzdir;
50+ } // lib.optionalAttrs (config.time.timeZone == null) {
51+ localtime.source = "/etc/zoneinfo/${config.time.timeZone}";
52+ localtime.mode = "direct-symlink";
53 };
00054 };
5556}
+45
nixos/tests/timezone.nix
···000000000000000000000000000000000000000000000
···1+{
2+ timezone-static = import ./make-test.nix ({ pkgs, ... }: {
3+ name = "timezone-static";
4+ meta.maintainers = with pkgs.lib.maintainers; [ lheckemann ];
5+6+ machine.time.timeZone = "Europe/Amsterdam";
7+8+ testScript = ''
9+ $machine->waitForUnit("dbus.socket");
10+ $machine->fail("timedatectl set-timezone Asia/Tokyo");
11+ my @dateResult = $machine->execute('date -d @0 "+%Y-%m-%d %H:%M:%S"');
12+ $dateResult[1] eq "1970-01-01 01:00:00\n" or die "Timezone seems to be wrong";
13+ '';
14+ });
15+16+ timezone-imperative = import ./make-test.nix ({ pkgs, ... }: {
17+ name = "timezone-imperative";
18+ meta.maintainers = with pkgs.lib.maintainers; [ lheckemann ];
19+20+ machine.time.timeZone = null;
21+22+ testScript = ''
23+ $machine->waitForUnit("dbus.socket");
24+25+ # Should default to UTC
26+ my @dateResult = $machine->execute('date -d @0 "+%Y-%m-%d %H:%M:%S"');
27+ print $dateResult[1];
28+ $dateResult[1] eq "1970-01-01 00:00:00\n" or die "Timezone seems to be wrong";
29+30+ $machine->succeed("timedatectl set-timezone Asia/Tokyo");
31+32+ # Adjustment should be taken into account
33+ my @dateResult = $machine->execute('date -d @0 "+%Y-%m-%d %H:%M:%S"');
34+ print $dateResult[1];
35+ $dateResult[1] eq "1970-01-01 09:00:00\n" or die "Timezone was not adjusted";
36+37+ # Adjustment should persist across a reboot
38+ $machine->shutdown;
39+ $machine->waitForUnit("dbus.socket");
40+ my @dateResult = $machine->execute('date -d @0 "+%Y-%m-%d %H:%M:%S"');
41+ print $dateResult[1];
42+ $dateResult[1] eq "1970-01-01 09:00:00\n" or die "Timezone adjustment was not persisted";
43+ '';
44+ });
45+}