diff --git a/gnu/local.mk b/gnu/local.mk
index 83937db4c8..0a0ef49719 100644
--- a/gnu/local.mk
+++ b/gnu/local.mk
@@ -1950,7 +1950,6 @@ dist_patch_DATA =						\
   %D%/packages/patches/qtbase-moc-ignore-gcc-macro.patch	\
   %D%/packages/patches/qtbase-qmake-use-libname.patch		\
   %D%/packages/patches/qtbase-5-use-TZDIR.patch			\
-  %D%/packages/patches/qtbase-use-TZDIR.patch			\
   %D%/packages/patches/qtscript-disable-tests.patch		\
   %D%/packages/patches/quagga-reproducible-build.patch          \
   %D%/packages/patches/quickswitch-fix-dmenu-check.patch	\
diff --git a/gnu/packages/patches/qtbase-use-TZDIR.patch b/gnu/packages/patches/qtbase-use-TZDIR.patch
deleted file mode 100644
index 98bf7493e9..0000000000
--- a/gnu/packages/patches/qtbase-use-TZDIR.patch
+++ /dev/null
@@ -1,141 +0,0 @@
-From 1075606f8b2f9e153c82f8e50cbd69cea9c72e87 Mon Sep 17 00:00:00 2001
-From: Edward Welbourne <edward.welbourne@qt.io>
-Date: Mon, 11 Sep 2023 11:41:39 +0200
-Subject: [PATCH] Support the TZDIR environment variable
-
-On Linux / glibc, this overrides the default system location for the
-zone info. So check for files there first. Break out a function to
-manage the trying of (now three) zoneinfo directories when opening a
-file by name relative to there.
-
-Pick-to: 6.6 6.5
-Task-number: QTBUG-116017
-Change-Id: I1f97107aabd9015c0a5543639870f1d70654ca67
----
-* Rebased on top of v6.5.2.
-
- src/corelib/time/qtimezoneprivate_tz.cpp | 73 ++++++++++++++++--------
- 1 file changed, 49 insertions(+), 24 deletions(-)
-
-diff --git a/src/corelib/time/qtimezoneprivate_tz.cpp b/src/corelib/time/qtimezoneprivate_tz.cpp
-index 067191d816..a8b2fc894e 100644
---- a/src/corelib/time/qtimezoneprivate_tz.cpp
-+++ b/src/corelib/time/qtimezoneprivate_tz.cpp
-@@ -51,17 +51,41 @@ typedef QHash<QByteArray, QTzTimeZone> QTzTimeZoneHash;
- 
- static bool isTzFile(const QString &name);
- 
-+// Open a named file under the zone info directory:
-+static bool openZoneInfo(QString name, QFile *file)
-+{
-+    // At least on Linux / glibc (see man 3 tzset), $TZDIR overrides the system
-+    // default location for zone info:
-+    const QString tzdir = qEnvironmentVariable("TZDIR");
-+    if (!tzdir.isEmpty()) {
-+        file->setFileName(QDir(tzdir).filePath(name));
-+        if (file->open(QIODevice::ReadOnly))
-+            return true;
-+    }
-+    // Try modern system path first:
-+    constexpr auto zoneShare = "/usr/share/zoneinfo/"_L1;
-+    if (tzdir != zoneShare && tzdir != zoneShare.chopped(1)) {
-+        file->setFileName(zoneShare + name);
-+        if (file->open(QIODevice::ReadOnly))
-+            return true;
-+    }
-+    // Fall back to legacy system path:
-+    constexpr auto zoneLib = "/usr/lib/zoneinfo/"_L1;
-+    if (tzdir != zoneLib && tzdir != zoneLib.chopped(1)) {
-+        file->setFileName(zoneShare + name);
-+        if (file->open(QIODevice::ReadOnly))
-+            return true;
-+    }
-+    return false;
-+}
-+
- // Parse zone.tab table for territory information, read directories to ensure we
- // find all installed zones (many are omitted from zone.tab; even more from
- // zone1970.tab).
- static QTzTimeZoneHash loadTzTimeZones()
- {
--    QString path = QStringLiteral("/usr/share/zoneinfo/zone.tab");
--    if (!QFile::exists(path))
--        path = QStringLiteral("/usr/lib/zoneinfo/zone.tab");
--
--    QFile tzif(path);
--    if (!tzif.open(QIODevice::ReadOnly))
-+    QFile tzif;
-+    if (!openZoneInfo("zone.tab"_L1, &tzif))
-         return QTzTimeZoneHash();
- 
-     QTzTimeZoneHash zonesHash;
-@@ -91,6 +115,7 @@ static QTzTimeZoneHash loadTzTimeZones()
-         }
-     }
- 
-+    const QString path = tzif.fileName();
-     const qsizetype cut = path.lastIndexOf(u'/');
-     Q_ASSERT(cut > 0);
-     const QDir zoneDir = QDir(path.first(cut));
-@@ -761,20 +786,13 @@ QTzTimeZoneCacheEntry QTzTimeZoneCache::findEntry(const QByteArray &ianaId)
-         tzif.setFileName(QStringLiteral("/etc/localtime"));
-         if (!tzif.open(QIODevice::ReadOnly))
-             return ret;
--    } else {
--        // Open named tz, try modern path first, if fails try legacy path
--        tzif.setFileName("/usr/share/zoneinfo/"_L1 + QString::fromLocal8Bit(ianaId));
--        if (!tzif.open(QIODevice::ReadOnly)) {
--            tzif.setFileName("/usr/lib/zoneinfo/"_L1 + QString::fromLocal8Bit(ianaId));
--            if (!tzif.open(QIODevice::ReadOnly)) {
--                // ianaId may be a POSIX rule, taken from $TZ or /etc/TZ
--                auto check = validatePosixRule(ianaId);
--                if (check.isValid) {
--                    ret.m_hasDst = check.hasDst;
--                    ret.m_posixRule = ianaId;
--                }
--                return ret;
--            }
-+    } else if (!openZoneInfo(QString::fromLocal8Bit(ianaId), &tzif)) {
-+        // ianaId may be a POSIX rule, taken from $TZ or /etc/TZ
-+        auto check = validatePosixRule(ianaId);
-+        if (check.isValid) {
-+            ret.m_hasDst = check.hasDst;
-+            ret.m_posixRule = ianaId;
-+            return ret;
-         }
-     }
- 
-@@ -1317,7 +1335,8 @@ private:
-     {
-         // On most distros /etc/localtime is a symlink to a real file so extract
-         // name from the path
--        const auto zoneinfo = "/zoneinfo/"_L1;
-+        const QString tzdir = qEnvironmentVariable("TZDIR");
-+        constexpr auto zoneinfo = "/zoneinfo/"_L1;
-         QString path = QStringLiteral("/etc/localtime");
-         long iteration = getSymloopMax();
-         // Symlink may point to another symlink etc. before being under zoneinfo/
-@@ -1325,9 +1344,15 @@ private:
-         // symlink, like America/Montreal pointing to America/Toronto
-         do {
-             path = QFile::symLinkTarget(path);
--            int index = path.indexOf(zoneinfo);
--            if (index >= 0) // Found zoneinfo file; extract zone name from path:
--                return QStringView{ path }.mid(index + zoneinfo.size()).toUtf8();
-+            // If it's a zoneinfo file, extract the zone name from its path:
-+            int index = tzdir.isEmpty() ? -1 : path.indexOf(tzdir);
-+            if (index >= 0) {
-+                const auto tail = QStringView{ path }.sliced(index + tzdir.size()).toUtf8();
-+                return tail.startsWith(u'/') ? tail.sliced(1) : tail;
-+            }
-+            index = path.indexOf(zoneinfo);
-+            if (index >= 0)
-+                return QStringView{ path }.sliced(index + zoneinfo.size()).toUtf8();
-         } while (!path.isEmpty() && --iteration > 0);
- 
-         return QByteArray();
-
-base-commit: af457a9f0f7eb1a2a7d11f495da508faab91a442
--- 
-2.41.0
-
diff --git a/gnu/packages/qt.scm b/gnu/packages/qt.scm
index 761d12e31f..13008154c4 100644
--- a/gnu/packages/qt.scm
+++ b/gnu/packages/qt.scm
@@ -67,6 +67,7 @@ (define-module (gnu packages qt)
   #:use-module (gnu packages bash)
   #:use-module (gnu packages base)
   #:use-module (gnu packages bison)
+  #:use-module (gnu packages crypto)
   #:use-module (gnu packages check)
   #:use-module (gnu packages cmake)
   #:use-module (gnu packages compression)
@@ -654,25 +655,22 @@ (define-public qtbase
   (package
     (inherit qtbase-5)
     (name "qtbase")
-    (version "6.5.2")
+    (version "6.6.2")
     (source (origin
               (inherit (package-source qtbase-5))
               (uri (qt-url name version))
               (sha256
                (base32
-                "0s8jwzdcv97dfy8n3jjm8zzvllv380l73mwdva7rs2nqnhlwgd1x"))
+                "0yv78bwqzy975854h53rbiilsms62f3v02i3jqz7v8ajk1ml56xq"))
               (modules '((guix build utils)))
               (snippet
                ;; corelib uses bundled harfbuzz, md4, md5, sha3
                '(with-directory-excursion "src/3rdparty"
                   (for-each delete-file-recursively
-                            ;; The bundled pcre2 copy is kept, as its headers
-                            ;; are required by some internal bootstrap target
-                            ;; used for the tools.
                             (list "double-conversion" "freetype" "harfbuzz-ng"
-                                  "libpng" "libjpeg" "sqlite" "xcb" "zlib"))))
-              (patches (search-patches "qtbase-use-TZDIR.patch"
-                                       "qtbase-moc-ignore-gcc-macro.patch"
+                                  "pcre2" "md4c" "libpng" "libjpeg"
+                                  "sqlite" "xcb" "zlib"))))
+              (patches (search-patches "qtbase-moc-ignore-gcc-macro.patch"
                                        "qtbase-absolute-runpath.patch"
                                        "qtbase-qmake-use-libname.patch"))))
     (build-system cmake-build-system)
@@ -814,6 +812,9 @@ (define-public qtbase
                     (string-join
                      (append
                       (list
+                       ;; FIXME
+                       "tst_qt_cmake_create"
+                       "tst_selftests"
                        ;; The 'tst_moc' test fails with "'fi.exists()' returned FALSE".
                        "tst_moc"
 
@@ -984,6 +985,7 @@ (define-public qtbase
                 bash-minimal
                 coreutils-minimal
                 md4c
+                libb2
                 libice
                 libsm
                 libxcb
