···1414 time = {
15151616 timeZone = mkOption {
1717- default = "UTC";
1818- type = types.str;
1717+ default = null;
1818+ type = types.nullOr types.str;
1919 example = "America/New_York";
2020 description = ''
2121 The time zone used when displaying times and dates. See <link
2222 xlink:href="https://en.wikipedia.org/wiki/List_of_tz_database_time_zones"/>
2323 for a comprehensive list of possible values for this setting.
2424+2525+ If null, the timezone will default to UTC and can be set imperatively
2626+ using timedatectl.
2427 '';
2528 };
2629···4043 # This way services are restarted when tzdata changes.
4144 systemd.globalEnvironment.TZDIR = tzdir;
42454343- environment.etc.localtime =
4444- { source = "/etc/zoneinfo/${config.time.timeZone}";
4545- mode = "direct-symlink";
4646+ systemd.services.systemd-timedated.environment = lib.optionalAttrs (config.time.timeZone != null) { NIXOS_STATIC_TIMEZONE = "1"; };
4747+4848+ environment.etc = {
4949+ zoneinfo.source = tzdir;
5050+ } // lib.optionalAttrs (config.time.timeZone == null) {
5151+ localtime.source = "/etc/zoneinfo/${config.time.timeZone}";
5252+ localtime.mode = "direct-symlink";
4653 };
4747-4848- environment.etc.zoneinfo.source = tzdir;
4949-5054 };
51555256}
+45
nixos/tests/timezone.nix
···11+{
22+ timezone-static = import ./make-test.nix ({ pkgs, ... }: {
33+ name = "timezone-static";
44+ meta.maintainers = with pkgs.lib.maintainers; [ lheckemann ];
55+66+ machine.time.timeZone = "Europe/Amsterdam";
77+88+ testScript = ''
99+ $machine->waitForUnit("dbus.socket");
1010+ $machine->fail("timedatectl set-timezone Asia/Tokyo");
1111+ my @dateResult = $machine->execute('date -d @0 "+%Y-%m-%d %H:%M:%S"');
1212+ $dateResult[1] eq "1970-01-01 01:00:00\n" or die "Timezone seems to be wrong";
1313+ '';
1414+ });
1515+1616+ timezone-imperative = import ./make-test.nix ({ pkgs, ... }: {
1717+ name = "timezone-imperative";
1818+ meta.maintainers = with pkgs.lib.maintainers; [ lheckemann ];
1919+2020+ machine.time.timeZone = null;
2121+2222+ testScript = ''
2323+ $machine->waitForUnit("dbus.socket");
2424+2525+ # Should default to UTC
2626+ my @dateResult = $machine->execute('date -d @0 "+%Y-%m-%d %H:%M:%S"');
2727+ print $dateResult[1];
2828+ $dateResult[1] eq "1970-01-01 00:00:00\n" or die "Timezone seems to be wrong";
2929+3030+ $machine->succeed("timedatectl set-timezone Asia/Tokyo");
3131+3232+ # Adjustment should be taken into account
3333+ my @dateResult = $machine->execute('date -d @0 "+%Y-%m-%d %H:%M:%S"');
3434+ print $dateResult[1];
3535+ $dateResult[1] eq "1970-01-01 09:00:00\n" or die "Timezone was not adjusted";
3636+3737+ # Adjustment should persist across a reboot
3838+ $machine->shutdown;
3939+ $machine->waitForUnit("dbus.socket");
4040+ my @dateResult = $machine->execute('date -d @0 "+%Y-%m-%d %H:%M:%S"');
4141+ print $dateResult[1];
4242+ $dateResult[1] eq "1970-01-01 09:00:00\n" or die "Timezone adjustment was not persisted";
4343+ '';
4444+ });
4545+}