GH-48593: [C++] C++20: use standard calendar / timezone APIs - #48601

Merged
raulcd merged 1 commit into
apache:mainfrom
rok:cpp20_use_chrono
Mar 3, 2026
Merged

GH-48593: [C++] C++20: use standard calendar / timezone APIs#48601
raulcd merged 1 commit into
apache:mainfrom
rok:cpp20_use_chrono

Conversation

@rok

@rokrok commented Dec 19, 2025

Copy link
Copy Markdown
Member

Rationale for this change

Switch to std::chrono for MSVC to be able to use the system-provided timezone automatically on Windows.

What changes are included in this PR?

This adds chrono_internal.h that uses C++20 std::chrono timezone/calendar APIs on compilers with support (MSVC only for now) and falls back to vendored date.h otherwise.

Are these changes tested?

Partially tested locally and partially to be tested on CI.

Are there any user-facing changes?

Yes, Windows users will no longer need to install the IANA tzdb (see instructions here and here). We possibly have tzdb download set up in CI too and should update it appropriately.

@github-actions

Copy link
Copy Markdown

⚠️ GitHub issue #48593has been automatically assigned in GitHub to PR creator.

@rok
rokforce-pushed the cpp20_use_chrono branch 9 times, most recently from 4283740 to d82f990CompareDecember 23, 2025 18:14
@rok

rok commented Dec 23, 2025

Copy link
Copy Markdown
MemberAuthor

It seems that std::chrono on GCC (14.3.0, 15.2.0) potentially has a bug that triggers some of our tests. Meanwhile std::chrono on MSVC 19.44 ( 14.44) appears to be pass them and is correct or at least consistent with vendored date.h. I would therefore advise we only switch to std::chrono on MSVC for now as that gives us the most benefit anyway (users no longer have to deal with the tz db).

Below is the explanation and reproduction of the bug.

// GCC libstdc++ DST bug reproduction
//
// The AN to AS Transition Bug
// ---------------------------
// Source https://github.com/eggert/tz/blob/c37fbc3249c1a1334948b38f3bca47dee5c11dd1/australasia#L165-L192
// Australia/Broken_Hill used the AN (New South Wales) rules until 2000, then
// switched to AS (South Australia) rules. Under AN rules, DST started the last
// Sunday of October and ended the last Sunday of March. For the 1999-2000
// summer, DST started October 31, 1999 and would end March 26, 2000. February
// 29, 2000 falls squarely within this DST period, so the correct offset should
// be 9:30 base + 1:00 DST = 10:30 (630 minutes).
//
// Why GCC's Data is Wrong
// -----------------------
// When libstdc++ processes the zone transition from AN rules to AS rules (which
// happens in year 2000), it appears to lose or reset the DST state inherited
// from the AN rules. Instead of recognizing that DST is still active from the
// October 1999 transition, it reports offset=570 (just the 9:30 base) with
// save=0. The inconsistency is evident: it returns abbrev="ACDT" (daylight
// time) but the offset and save values indicate standard time. The AN rules
// clearly show DST should be active until the last Sunday of March 2000.
//
// Compile: g++ -std=c++20 -o gcc_dst_bug gcc_libstdcxx_dst_bug.cpp
// Expected: 630 (10:30 = 9:30 base + 1:00 DST)
// Actual: 570 (9:30 = base only, DST missing)
#include <chrono>
#include <iostream>
int main() {
using namespace std::chrono;
auto* tz = locate_zone("Australia/Broken_Hill");
auto info = tz->get_info(sys_days{2000y / February / 29d} + 23h + 23min + 23s);
std::cout << duration_cast<minutes>(info.offset).count() << "\n";
}

@rok
rok marked this pull request as ready for review December 23, 2025 18:46
@rok

rok commented Dec 23, 2025

Copy link
Copy Markdown
MemberAuthor

@pitrou

@rokrok changed the title GH-48593: [Draft][C++] C++20: use standard calendar / timezone APIsGH-48593: [C++] C++20: use standard calendar / timezone APIsDec 23, 2025
Comment threadcpp/src/arrow/compute/kernels/scalar_temporal_test.cc Outdated
Comment threadcpp/src/arrow/util/chrono_internal.h Outdated
Comment threadcpp/src/arrow/util/chrono_internal.h
@pitrou

Copy link
Copy Markdown
Member

It seems that std::chrono on GCC (14.3.0, 15.2.0) potentially has a bug that triggers some of our tests.

Is the bug reported somewhere? If not, can you do that?

@pitrou

Copy link
Copy Markdown
Member

We possibly have tzdb download set up in CI too and should update it appropriately.

Yes, I think we should do so. There are also a bunch of code snippets in the C++ and Python codebase that could be removed, IIRC.

@rok

rok commented Jan 5, 2026

Copy link
Copy Markdown
MemberAuthor

Is the bug reported somewhere? If not, can you do that?

It seems to be related to a known issue, I added comment explaining our case.

@github-actionsgithub-actionsBot added awaiting changes Awaiting changes awaiting change review Awaiting change review and removed awaiting committer review Awaiting committer review awaiting changes Awaiting changes labels Jan 5, 2026
Comment threadcpp/src/arrow/util/chrono_internal.h Outdated
@github-actionsgithub-actionsBot added awaiting changes Awaiting changes and removed awaiting change review Awaiting change review labels Jan 5, 2026
@rok

rok commented Feb 27, 2026

Copy link
Copy Markdown
MemberAuthor

@github-actions crossbow submit test-r-macos-as-cran

@github-actions

Copy link
Copy Markdown

Revision: 4c5e112

Submitted crossbow builds: ursacomputing/crossbow @ actions-cb3021940b

TaskStatus
test-r-macos-as-cranGitHub Actions

@rok

rok commented Feb 27, 2026

Copy link
Copy Markdown
MemberAuthor

@github-actions crossbow submit test-r-macos-as-cran

@github-actions

Copy link
Copy Markdown

Revision: 9e87d57

Submitted crossbow builds: ursacomputing/crossbow @ actions-a1f6d9bce5

TaskStatus
test-r-macos-as-cranGitHub Actions

@rok

rok commented Feb 27, 2026

Copy link
Copy Markdown
MemberAuthor

I've tried a couple of eebases rebasing on commit before e37c516 succeeded. Trying rebase on 59e0ba6 now. I hope there's not too much to workaround.

@rok

rok commented Feb 27, 2026

Copy link
Copy Markdown
MemberAuthor

@github-actions crossbow submit test-r-macos-as-cran

@github-actions

Copy link
Copy Markdown

Revision: c6caa3c

Submitted crossbow builds: ursacomputing/crossbow @ actions-10e324e6df

TaskStatus
test-r-macos-as-cranGitHub Actions

@rok

rok commented Feb 28, 2026

Copy link
Copy Markdown
MemberAuthor

@jonkeane I rebased to the commit before #49298 and cherrypicked #49223 commit. CRAN CI is now passing. So this PR by itself is above board for CRAN I suppose?

@rok

rok commented Feb 28, 2026

Copy link
Copy Markdown
MemberAuthor

@pitrou since this won't cause issues with CRAN shall we proceed with review?

@rok

rok commented Mar 2, 2026

Copy link
Copy Markdown
MemberAuthor

@github-actions crossbow submit test-r-macos-as-cran

@github-actions

Copy link
Copy Markdown

Revision: a6660df

Submitted crossbow builds: ursacomputing/crossbow @ actions-608e1ed947

TaskStatus
test-r-macos-as-cranGitHub Actions

@rok

rok commented Mar 2, 2026

Copy link
Copy Markdown
MemberAuthor

@github-actions crossbow submit test-r-macos-as-cran

@github-actions

Copy link
Copy Markdown

Revision: aa7aaaf

Submitted crossbow builds: ursacomputing/crossbow @ actions-3ff0f4aa7e

TaskStatus
test-r-macos-as-cranGitHub Actions

@rok

rok commented Mar 2, 2026

Copy link
Copy Markdown
MemberAuthor

@github-actions crossbow submit -g cpp

@github-actions

Copy link
Copy Markdown

Revision: 6ebc076

Submitted crossbow builds: ursacomputing/crossbow @ actions-a0333069ef

TaskStatus
example-cpp-minimal-build-staticGitHub Actions
example-cpp-minimal-build-static-system-dependencyGitHub Actions
example-cpp-tutorialGitHub Actions
test-build-cpp-fuzzGitHub Actions
test-conda-cppGitHub Actions
test-conda-cpp-valgrindGitHub Actions
test-debian-13-cpp-amd64GitHub Actions
test-debian-13-cpp-i386GitHub Actions
test-debian-experimental-cpp-gcc-15GitHub Actions
test-fedora-42-cppGitHub Actions
test-ubuntu-22.04-cppGitHub Actions
test-ubuntu-22.04-cpp-20GitHub Actions
test-ubuntu-22.04-cpp-bundledGitHub Actions
test-ubuntu-22.04-cpp-emscriptenGitHub Actions
test-ubuntu-22.04-cpp-no-threadingGitHub Actions
test-ubuntu-24.04-cppGitHub Actions
test-ubuntu-24.04-cpp-bundled-offlineGitHub Actions
test-ubuntu-24.04-cpp-gcc-13-bundledGitHub Actions
test-ubuntu-24.04-cpp-gcc-14GitHub Actions
test-ubuntu-24.04-cpp-minimal-with-formatsGitHub Actions
test-ubuntu-24.04-cpp-thread-sanitizerGitHub Actions

@rok

rok commented Mar 2, 2026

Copy link
Copy Markdown
MemberAuthor

@github-actions crossbow submit test-r-macos-as-cran

@github-actions

Copy link
Copy Markdown

Revision: 6ebc076

Submitted crossbow builds: ursacomputing/crossbow @ actions-8f1eea3959

TaskStatus
test-r-macos-as-cranGitHub Actions

@rok

rok commented Mar 2, 2026

Copy link
Copy Markdown
MemberAuthor

After rebasing on @jonkeane's #49405 this now seems to pass the CRAN CI.
@pitrou do you think we should get this in for the release?

@rok

rok commented Mar 2, 2026

Copy link
Copy Markdown
MemberAuthor

cc @raulcd

@pitrou

Copy link
Copy Markdown
Member

@rok This PR is fine to me, @raulcd will be the approver here :)

@raulcd

Copy link
Copy Markdown
Member

@github-actions crossbow submit wheel-cp313

@github-actions

Copy link
Copy Markdown

Revision: 6ebc076

Submitted crossbow builds: ursacomputing/crossbow @ actions-7e859b5810

TaskStatus
wheel-macos-monterey-cp313-cp313-amd64GitHub Actions
wheel-macos-monterey-cp313-cp313-arm64GitHub Actions
wheel-macos-monterey-cp313-cp313t-amd64GitHub Actions
wheel-macos-monterey-cp313-cp313t-arm64GitHub Actions
wheel-manylinux-2-28-cp313-cp313-amd64GitHub Actions
wheel-manylinux-2-28-cp313-cp313-arm64GitHub Actions
wheel-manylinux-2-28-cp313-cp313t-amd64GitHub Actions
wheel-manylinux-2-28-cp313-cp313t-arm64GitHub Actions
wheel-musllinux-1-2-cp313-cp313-amd64GitHub Actions
wheel-musllinux-1-2-cp313-cp313-arm64GitHub Actions
wheel-musllinux-1-2-cp313-cp313t-amd64GitHub Actions
wheel-musllinux-1-2-cp313-cp313t-arm64GitHub Actions
wheel-windows-cp313-cp313-amd64GitHub Actions
wheel-windows-cp313-cp313t-amd64GitHub Actions

@raulcdraulcd left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This looks like a great improvement! Thanks @rok !

@rok

rok commented Mar 3, 2026

Copy link
Copy Markdown
MemberAuthor

Thanks for reviews all! I'll keep an eye on the follow-up issue #48743. Feel free to open more if needed.

@conbench-apache-arrow

Copy link
Copy Markdown

After merging your PR, Conbench analyzed the 3 benchmarking runs that have been run so far on merge-commit c48e81e.

There were no benchmark performance regressions. 🎉

The full Conbench report has more details. It also includes information about 7 possible false positives for unstable benchmarks that are known to sometimes produce them.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

8 participants

@rok@pitrou@kou@jonkeane@h-vetinari@raulcd@jorisvandenbossche@thisisnic
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all \u003cpre\u003e\u003ccode\u003e blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks"); } } catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); } })(); (function(){ try { var __m = "github.com"; var __re = new RegExp('^' + "github\\.com" + '
Skip to content

GH-48593: [C++] C++20: use standard calendar / timezone APIs - #48601

Merged
raulcd merged 1 commit into
apache:mainfrom
rok:cpp20_use_chrono
Mar 3, 2026
Merged

GH-48593: [C++] C++20: use standard calendar / timezone APIs#48601
raulcd merged 1 commit into
apache:mainfrom
rok:cpp20_use_chrono

Conversation

@rok

@rokrok commented Dec 19, 2025

Copy link
Copy Markdown
Member

Rationale for this change

Switch to std::chrono for MSVC to be able to use the system-provided timezone automatically on Windows.

What changes are included in this PR?

This adds chrono_internal.h that uses C++20 std::chrono timezone/calendar APIs on compilers with support (MSVC only for now) and falls back to vendored date.h otherwise.

Are these changes tested?

Partially tested locally and partially to be tested on CI.

Are there any user-facing changes?

Yes, Windows users will no longer need to install the IANA tzdb (see instructions here and here). We possibly have tzdb download set up in CI too and should update it appropriately.

@github-actions

Copy link
Copy Markdown

⚠️ GitHub issue #48593has been automatically assigned in GitHub to PR creator.

@rok
rokforce-pushed the cpp20_use_chrono branch 9 times, most recently from 4283740 to d82f990CompareDecember 23, 2025 18:14
@rok

rok commented Dec 23, 2025

Copy link
Copy Markdown
MemberAuthor

It seems that std::chrono on GCC (14.3.0, 15.2.0) potentially has a bug that triggers some of our tests. Meanwhile std::chrono on MSVC 19.44 ( 14.44) appears to be pass them and is correct or at least consistent with vendored date.h. I would therefore advise we only switch to std::chrono on MSVC for now as that gives us the most benefit anyway (users no longer have to deal with the tz db).

Below is the explanation and reproduction of the bug.

// GCC libstdc++ DST bug reproduction
//
// The AN to AS Transition Bug
// ---------------------------
// Source https://github.com/eggert/tz/blob/c37fbc3249c1a1334948b38f3bca47dee5c11dd1/australasia#L165-L192
// Australia/Broken_Hill used the AN (New South Wales) rules until 2000, then
// switched to AS (South Australia) rules. Under AN rules, DST started the last
// Sunday of October and ended the last Sunday of March. For the 1999-2000
// summer, DST started October 31, 1999 and would end March 26, 2000. February
// 29, 2000 falls squarely within this DST period, so the correct offset should
// be 9:30 base + 1:00 DST = 10:30 (630 minutes).
//
// Why GCC's Data is Wrong
// -----------------------
// When libstdc++ processes the zone transition from AN rules to AS rules (which
// happens in year 2000), it appears to lose or reset the DST state inherited
// from the AN rules. Instead of recognizing that DST is still active from the
// October 1999 transition, it reports offset=570 (just the 9:30 base) with
// save=0. The inconsistency is evident: it returns abbrev="ACDT" (daylight
// time) but the offset and save values indicate standard time. The AN rules
// clearly show DST should be active until the last Sunday of March 2000.
//
// Compile: g++ -std=c++20 -o gcc_dst_bug gcc_libstdcxx_dst_bug.cpp
// Expected: 630 (10:30 = 9:30 base + 1:00 DST)
// Actual: 570 (9:30 = base only, DST missing)
#include <chrono>
#include <iostream>
int main() {
using namespace std::chrono;
auto* tz = locate_zone("Australia/Broken_Hill");
auto info = tz->get_info(sys_days{2000y / February / 29d} + 23h + 23min + 23s);
std::cout << duration_cast<minutes>(info.offset).count() << "\n";
}

@rok
rok marked this pull request as ready for review December 23, 2025 18:46
@rok

rok commented Dec 23, 2025

Copy link
Copy Markdown
MemberAuthor

@pitrou

@rokrok changed the title GH-48593: [Draft][C++] C++20: use standard calendar / timezone APIsGH-48593: [C++] C++20: use standard calendar / timezone APIsDec 23, 2025
Comment threadcpp/src/arrow/compute/kernels/scalar_temporal_test.cc Outdated
Comment threadcpp/src/arrow/util/chrono_internal.h Outdated
Comment threadcpp/src/arrow/util/chrono_internal.h
@pitrou

Copy link
Copy Markdown
Member

It seems that std::chrono on GCC (14.3.0, 15.2.0) potentially has a bug that triggers some of our tests.

Is the bug reported somewhere? If not, can you do that?

@pitrou

Copy link
Copy Markdown
Member

We possibly have tzdb download set up in CI too and should update it appropriately.

Yes, I think we should do so. There are also a bunch of code snippets in the C++ and Python codebase that could be removed, IIRC.

@rok

rok commented Jan 5, 2026

Copy link
Copy Markdown
MemberAuthor

Is the bug reported somewhere? If not, can you do that?

It seems to be related to a known issue, I added comment explaining our case.

@github-actionsgithub-actionsBot added awaiting changes Awaiting changes awaiting change review Awaiting change review and removed awaiting committer review Awaiting committer review awaiting changes Awaiting changes labels Jan 5, 2026
Comment threadcpp/src/arrow/util/chrono_internal.h Outdated
@github-actionsgithub-actionsBot added awaiting changes Awaiting changes and removed awaiting change review Awaiting change review labels Jan 5, 2026
@rok

rok commented Feb 27, 2026

Copy link
Copy Markdown
MemberAuthor

@github-actions crossbow submit test-r-macos-as-cran

@github-actions

Copy link
Copy Markdown

Revision: 4c5e112

Submitted crossbow builds: ursacomputing/crossbow @ actions-cb3021940b

TaskStatus
test-r-macos-as-cranGitHub Actions

@rok

rok commented Feb 27, 2026

Copy link
Copy Markdown
MemberAuthor

@github-actions crossbow submit test-r-macos-as-cran

@github-actions

Copy link
Copy Markdown

Revision: 9e87d57

Submitted crossbow builds: ursacomputing/crossbow @ actions-a1f6d9bce5

TaskStatus
test-r-macos-as-cranGitHub Actions

@rok

rok commented Feb 27, 2026

Copy link
Copy Markdown
MemberAuthor

I've tried a couple of eebases rebasing on commit before e37c516 succeeded. Trying rebase on 59e0ba6 now. I hope there's not too much to workaround.

@rok

rok commented Feb 27, 2026

Copy link
Copy Markdown
MemberAuthor

@github-actions crossbow submit test-r-macos-as-cran

@github-actions

Copy link
Copy Markdown

Revision: c6caa3c

Submitted crossbow builds: ursacomputing/crossbow @ actions-10e324e6df

TaskStatus
test-r-macos-as-cranGitHub Actions

@rok

rok commented Feb 28, 2026

Copy link
Copy Markdown
MemberAuthor

@jonkeane I rebased to the commit before #49298 and cherrypicked #49223 commit. CRAN CI is now passing. So this PR by itself is above board for CRAN I suppose?

@rok

rok commented Feb 28, 2026

Copy link
Copy Markdown
MemberAuthor

@pitrou since this won't cause issues with CRAN shall we proceed with review?

@rok

rok commented Mar 2, 2026

Copy link
Copy Markdown
MemberAuthor

@github-actions crossbow submit test-r-macos-as-cran

@github-actions

Copy link
Copy Markdown

Revision: a6660df

Submitted crossbow builds: ursacomputing/crossbow @ actions-608e1ed947

TaskStatus
test-r-macos-as-cranGitHub Actions

@rok

rok commented Mar 2, 2026

Copy link
Copy Markdown
MemberAuthor

@github-actions crossbow submit test-r-macos-as-cran

@github-actions

Copy link
Copy Markdown

Revision: aa7aaaf

Submitted crossbow builds: ursacomputing/crossbow @ actions-3ff0f4aa7e

TaskStatus
test-r-macos-as-cranGitHub Actions

@rok

rok commented Mar 2, 2026

Copy link
Copy Markdown
MemberAuthor

@github-actions crossbow submit -g cpp

@github-actions

Copy link
Copy Markdown

Revision: 6ebc076

Submitted crossbow builds: ursacomputing/crossbow @ actions-a0333069ef

TaskStatus
example-cpp-minimal-build-staticGitHub Actions
example-cpp-minimal-build-static-system-dependencyGitHub Actions
example-cpp-tutorialGitHub Actions
test-build-cpp-fuzzGitHub Actions
test-conda-cppGitHub Actions
test-conda-cpp-valgrindGitHub Actions
test-debian-13-cpp-amd64GitHub Actions
test-debian-13-cpp-i386GitHub Actions
test-debian-experimental-cpp-gcc-15GitHub Actions
test-fedora-42-cppGitHub Actions
test-ubuntu-22.04-cppGitHub Actions
test-ubuntu-22.04-cpp-20GitHub Actions
test-ubuntu-22.04-cpp-bundledGitHub Actions
test-ubuntu-22.04-cpp-emscriptenGitHub Actions
test-ubuntu-22.04-cpp-no-threadingGitHub Actions
test-ubuntu-24.04-cppGitHub Actions
test-ubuntu-24.04-cpp-bundled-offlineGitHub Actions
test-ubuntu-24.04-cpp-gcc-13-bundledGitHub Actions
test-ubuntu-24.04-cpp-gcc-14GitHub Actions
test-ubuntu-24.04-cpp-minimal-with-formatsGitHub Actions
test-ubuntu-24.04-cpp-thread-sanitizerGitHub Actions

@rok

rok commented Mar 2, 2026

Copy link
Copy Markdown
MemberAuthor

@github-actions crossbow submit test-r-macos-as-cran

@github-actions

Copy link
Copy Markdown

Revision: 6ebc076

Submitted crossbow builds: ursacomputing/crossbow @ actions-8f1eea3959

TaskStatus
test-r-macos-as-cranGitHub Actions

@rok

rok commented Mar 2, 2026

Copy link
Copy Markdown
MemberAuthor

After rebasing on @jonkeane's #49405 this now seems to pass the CRAN CI.
@pitrou do you think we should get this in for the release?

@rok

rok commented Mar 2, 2026

Copy link
Copy Markdown
MemberAuthor

cc @raulcd

@pitrou

Copy link
Copy Markdown
Member

@rok This PR is fine to me, @raulcd will be the approver here :)

@raulcd

Copy link
Copy Markdown
Member

@github-actions crossbow submit wheel-cp313

@github-actions

Copy link
Copy Markdown

Revision: 6ebc076

Submitted crossbow builds: ursacomputing/crossbow @ actions-7e859b5810

TaskStatus
wheel-macos-monterey-cp313-cp313-amd64GitHub Actions
wheel-macos-monterey-cp313-cp313-arm64GitHub Actions
wheel-macos-monterey-cp313-cp313t-amd64GitHub Actions
wheel-macos-monterey-cp313-cp313t-arm64GitHub Actions
wheel-manylinux-2-28-cp313-cp313-amd64GitHub Actions
wheel-manylinux-2-28-cp313-cp313-arm64GitHub Actions
wheel-manylinux-2-28-cp313-cp313t-amd64GitHub Actions
wheel-manylinux-2-28-cp313-cp313t-arm64GitHub Actions
wheel-musllinux-1-2-cp313-cp313-amd64GitHub Actions
wheel-musllinux-1-2-cp313-cp313-arm64GitHub Actions
wheel-musllinux-1-2-cp313-cp313t-amd64GitHub Actions
wheel-musllinux-1-2-cp313-cp313t-arm64GitHub Actions
wheel-windows-cp313-cp313-amd64GitHub Actions
wheel-windows-cp313-cp313t-amd64GitHub Actions

@raulcdraulcd left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This looks like a great improvement! Thanks @rok !

@rok

rok commented Mar 3, 2026

Copy link
Copy Markdown
MemberAuthor

Thanks for reviews all! I'll keep an eye on the follow-up issue #48743. Feel free to open more if needed.

@conbench-apache-arrow

Copy link
Copy Markdown

After merging your PR, Conbench analyzed the 3 benchmarking runs that have been run so far on merge-commit c48e81e.

There were no benchmark performance regressions. 🎉

The full Conbench report has more details. It also includes information about 7 possible false positives for unstable benchmarks that are known to sometimes produce them.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

8 participants

@rok@pitrou@kou@jonkeane@h-vetinari@raulcd@jorisvandenbossche@thisisnic
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

GH-48593: [C++] C++20: use standard calendar / timezone APIs - #48601

Merged
raulcd merged 1 commit into
apache:mainfrom
rok:cpp20_use_chrono
Mar 3, 2026
Merged

GH-48593: [C++] C++20: use standard calendar / timezone APIs#48601
raulcd merged 1 commit into
apache:mainfrom
rok:cpp20_use_chrono

Conversation

@rok

@rokrok commented Dec 19, 2025

Copy link
Copy Markdown
Member

Rationale for this change

Switch to std::chrono for MSVC to be able to use the system-provided timezone automatically on Windows.

What changes are included in this PR?

This adds chrono_internal.h that uses C++20 std::chrono timezone/calendar APIs on compilers with support (MSVC only for now) and falls back to vendored date.h otherwise.

Are these changes tested?

Partially tested locally and partially to be tested on CI.

Are there any user-facing changes?

Yes, Windows users will no longer need to install the IANA tzdb (see instructions here and here). We possibly have tzdb download set up in CI too and should update it appropriately.

@github-actions

Copy link
Copy Markdown

⚠️ GitHub issue #48593has been automatically assigned in GitHub to PR creator.

@rok
rokforce-pushed the cpp20_use_chrono branch 9 times, most recently from 4283740 to d82f990CompareDecember 23, 2025 18:14
@rok

rok commented Dec 23, 2025

Copy link
Copy Markdown
MemberAuthor

It seems that std::chrono on GCC (14.3.0, 15.2.0) potentially has a bug that triggers some of our tests. Meanwhile std::chrono on MSVC 19.44 ( 14.44) appears to be pass them and is correct or at least consistent with vendored date.h. I would therefore advise we only switch to std::chrono on MSVC for now as that gives us the most benefit anyway (users no longer have to deal with the tz db).

Below is the explanation and reproduction of the bug.

// GCC libstdc++ DST bug reproduction
//
// The AN to AS Transition Bug
// ---------------------------
// Source https://github.com/eggert/tz/blob/c37fbc3249c1a1334948b38f3bca47dee5c11dd1/australasia#L165-L192
// Australia/Broken_Hill used the AN (New South Wales) rules until 2000, then
// switched to AS (South Australia) rules. Under AN rules, DST started the last
// Sunday of October and ended the last Sunday of March. For the 1999-2000
// summer, DST started October 31, 1999 and would end March 26, 2000. February
// 29, 2000 falls squarely within this DST period, so the correct offset should
// be 9:30 base + 1:00 DST = 10:30 (630 minutes).
//
// Why GCC's Data is Wrong
// -----------------------
// When libstdc++ processes the zone transition from AN rules to AS rules (which
// happens in year 2000), it appears to lose or reset the DST state inherited
// from the AN rules. Instead of recognizing that DST is still active from the
// October 1999 transition, it reports offset=570 (just the 9:30 base) with
// save=0. The inconsistency is evident: it returns abbrev="ACDT" (daylight
// time) but the offset and save values indicate standard time. The AN rules
// clearly show DST should be active until the last Sunday of March 2000.
//
// Compile: g++ -std=c++20 -o gcc_dst_bug gcc_libstdcxx_dst_bug.cpp
// Expected: 630 (10:30 = 9:30 base + 1:00 DST)
// Actual: 570 (9:30 = base only, DST missing)
#include <chrono>
#include <iostream>
int main() {
using namespace std::chrono;
auto* tz = locate_zone("Australia/Broken_Hill");
auto info = tz->get_info(sys_days{2000y / February / 29d} + 23h + 23min + 23s);
std::cout << duration_cast<minutes>(info.offset).count() << "\n";
}

@rok
rok marked this pull request as ready for review December 23, 2025 18:46
@rok

rok commented Dec 23, 2025

Copy link
Copy Markdown
MemberAuthor

@pitrou

@rokrok changed the title GH-48593: [Draft][C++] C++20: use standard calendar / timezone APIsGH-48593: [C++] C++20: use standard calendar / timezone APIsDec 23, 2025
Comment threadcpp/src/arrow/compute/kernels/scalar_temporal_test.cc Outdated
Comment threadcpp/src/arrow/util/chrono_internal.h Outdated
Comment threadcpp/src/arrow/util/chrono_internal.h
@pitrou

Copy link
Copy Markdown
Member

It seems that std::chrono on GCC (14.3.0, 15.2.0) potentially has a bug that triggers some of our tests.

Is the bug reported somewhere? If not, can you do that?

@pitrou

Copy link
Copy Markdown
Member

We possibly have tzdb download set up in CI too and should update it appropriately.

Yes, I think we should do so. There are also a bunch of code snippets in the C++ and Python codebase that could be removed, IIRC.

@rok

rok commented Jan 5, 2026

Copy link
Copy Markdown
MemberAuthor

Is the bug reported somewhere? If not, can you do that?

It seems to be related to a known issue, I added comment explaining our case.

@github-actionsgithub-actionsBot added awaiting changes Awaiting changes awaiting change review Awaiting change review and removed awaiting committer review Awaiting committer review awaiting changes Awaiting changes labels Jan 5, 2026
Comment threadcpp/src/arrow/util/chrono_internal.h Outdated
@github-actionsgithub-actionsBot added awaiting changes Awaiting changes and removed awaiting change review Awaiting change review labels Jan 5, 2026
@rok

rok commented Feb 27, 2026

Copy link
Copy Markdown
MemberAuthor

@github-actions crossbow submit test-r-macos-as-cran

@github-actions

Copy link
Copy Markdown

Revision: 4c5e112

Submitted crossbow builds: ursacomputing/crossbow @ actions-cb3021940b

TaskStatus
test-r-macos-as-cranGitHub Actions

@rok

rok commented Feb 27, 2026

Copy link
Copy Markdown
MemberAuthor

@github-actions crossbow submit test-r-macos-as-cran

@github-actions

Copy link
Copy Markdown

Revision: 9e87d57

Submitted crossbow builds: ursacomputing/crossbow @ actions-a1f6d9bce5

TaskStatus
test-r-macos-as-cranGitHub Actions

@rok

rok commented Feb 27, 2026

Copy link
Copy Markdown
MemberAuthor

I've tried a couple of eebases rebasing on commit before e37c516 succeeded. Trying rebase on 59e0ba6 now. I hope there's not too much to workaround.

@rok

rok commented Feb 27, 2026

Copy link
Copy Markdown
MemberAuthor

@github-actions crossbow submit test-r-macos-as-cran

@github-actions

Copy link
Copy Markdown

Revision: c6caa3c

Submitted crossbow builds: ursacomputing/crossbow @ actions-10e324e6df

TaskStatus
test-r-macos-as-cranGitHub Actions

@rok

rok commented Feb 28, 2026

Copy link
Copy Markdown
MemberAuthor

@jonkeane I rebased to the commit before #49298 and cherrypicked #49223 commit. CRAN CI is now passing. So this PR by itself is above board for CRAN I suppose?

@rok

rok commented Feb 28, 2026

Copy link
Copy Markdown
MemberAuthor

@pitrou since this won't cause issues with CRAN shall we proceed with review?

@rok

rok commented Mar 2, 2026

Copy link
Copy Markdown
MemberAuthor

@github-actions crossbow submit test-r-macos-as-cran

@github-actions

Copy link
Copy Markdown

Revision: a6660df

Submitted crossbow builds: ursacomputing/crossbow @ actions-608e1ed947

TaskStatus
test-r-macos-as-cranGitHub Actions

@rok

rok commented Mar 2, 2026

Copy link
Copy Markdown
MemberAuthor

@github-actions crossbow submit test-r-macos-as-cran

@github-actions

Copy link
Copy Markdown

Revision: aa7aaaf

Submitted crossbow builds: ursacomputing/crossbow @ actions-3ff0f4aa7e

TaskStatus
test-r-macos-as-cranGitHub Actions

@rok

rok commented Mar 2, 2026

Copy link
Copy Markdown
MemberAuthor

@github-actions crossbow submit -g cpp

@github-actions

Copy link
Copy Markdown

Revision: 6ebc076

Submitted crossbow builds: ursacomputing/crossbow @ actions-a0333069ef

TaskStatus
example-cpp-minimal-build-staticGitHub Actions
example-cpp-minimal-build-static-system-dependencyGitHub Actions
example-cpp-tutorialGitHub Actions
test-build-cpp-fuzzGitHub Actions
test-conda-cppGitHub Actions
test-conda-cpp-valgrindGitHub Actions
test-debian-13-cpp-amd64GitHub Actions
test-debian-13-cpp-i386GitHub Actions
test-debian-experimental-cpp-gcc-15GitHub Actions
test-fedora-42-cppGitHub Actions
test-ubuntu-22.04-cppGitHub Actions
test-ubuntu-22.04-cpp-20GitHub Actions
test-ubuntu-22.04-cpp-bundledGitHub Actions
test-ubuntu-22.04-cpp-emscriptenGitHub Actions
test-ubuntu-22.04-cpp-no-threadingGitHub Actions
test-ubuntu-24.04-cppGitHub Actions
test-ubuntu-24.04-cpp-bundled-offlineGitHub Actions
test-ubuntu-24.04-cpp-gcc-13-bundledGitHub Actions
test-ubuntu-24.04-cpp-gcc-14GitHub Actions
test-ubuntu-24.04-cpp-minimal-with-formatsGitHub Actions
test-ubuntu-24.04-cpp-thread-sanitizerGitHub Actions

@rok

rok commented Mar 2, 2026

Copy link
Copy Markdown
MemberAuthor

@github-actions crossbow submit test-r-macos-as-cran

@github-actions

Copy link
Copy Markdown

Revision: 6ebc076

Submitted crossbow builds: ursacomputing/crossbow @ actions-8f1eea3959

TaskStatus
test-r-macos-as-cranGitHub Actions

@rok

rok commented Mar 2, 2026

Copy link
Copy Markdown
MemberAuthor

After rebasing on @jonkeane's #49405 this now seems to pass the CRAN CI.
@pitrou do you think we should get this in for the release?

@rok

rok commented Mar 2, 2026

Copy link
Copy Markdown
MemberAuthor

cc @raulcd

@pitrou

Copy link
Copy Markdown
Member

@rok This PR is fine to me, @raulcd will be the approver here :)

@raulcd

Copy link
Copy Markdown
Member

@github-actions crossbow submit wheel-cp313

@github-actions

Copy link
Copy Markdown

Revision: 6ebc076

Submitted crossbow builds: ursacomputing/crossbow @ actions-7e859b5810

TaskStatus
wheel-macos-monterey-cp313-cp313-amd64GitHub Actions
wheel-macos-monterey-cp313-cp313-arm64GitHub Actions
wheel-macos-monterey-cp313-cp313t-amd64GitHub Actions
wheel-macos-monterey-cp313-cp313t-arm64GitHub Actions
wheel-manylinux-2-28-cp313-cp313-amd64GitHub Actions
wheel-manylinux-2-28-cp313-cp313-arm64GitHub Actions
wheel-manylinux-2-28-cp313-cp313t-amd64GitHub Actions
wheel-manylinux-2-28-cp313-cp313t-arm64GitHub Actions
wheel-musllinux-1-2-cp313-cp313-amd64GitHub Actions
wheel-musllinux-1-2-cp313-cp313-arm64GitHub Actions
wheel-musllinux-1-2-cp313-cp313t-amd64GitHub Actions
wheel-musllinux-1-2-cp313-cp313t-arm64GitHub Actions
wheel-windows-cp313-cp313-amd64GitHub Actions
wheel-windows-cp313-cp313t-amd64GitHub Actions

@raulcdraulcd left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This looks like a great improvement! Thanks @rok !

@rok

rok commented Mar 3, 2026

Copy link
Copy Markdown
MemberAuthor

Thanks for reviews all! I'll keep an eye on the follow-up issue #48743. Feel free to open more if needed.

@conbench-apache-arrow

Copy link
Copy Markdown

After merging your PR, Conbench analyzed the 3 benchmarking runs that have been run so far on merge-commit c48e81e.

There were no benchmark performance regressions. 🎉

The full Conbench report has more details. It also includes information about 7 possible false positives for unstable benchmarks that are known to sometimes produce them.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

8 participants

@rok@pitrou@kou@jonkeane@h-vetinari@raulcd@jorisvandenbossche@thisisnic
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length \u003e 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

GH-48593: [C++] C++20: use standard calendar / timezone APIs - #48601

Merged
raulcd merged 1 commit into
apache:mainfrom
rok:cpp20_use_chrono
Mar 3, 2026
Merged

GH-48593: [C++] C++20: use standard calendar / timezone APIs#48601
raulcd merged 1 commit into
apache:mainfrom
rok:cpp20_use_chrono

Conversation

@rok

@rokrok commented Dec 19, 2025

Copy link
Copy Markdown
Member

Rationale for this change

Switch to std::chrono for MSVC to be able to use the system-provided timezone automatically on Windows.

What changes are included in this PR?

This adds chrono_internal.h that uses C++20 std::chrono timezone/calendar APIs on compilers with support (MSVC only for now) and falls back to vendored date.h otherwise.

Are these changes tested?

Partially tested locally and partially to be tested on CI.

Are there any user-facing changes?

Yes, Windows users will no longer need to install the IANA tzdb (see instructions here and here). We possibly have tzdb download set up in CI too and should update it appropriately.

@github-actions

Copy link
Copy Markdown

⚠️ GitHub issue #48593has been automatically assigned in GitHub to PR creator.

@rok
rokforce-pushed the cpp20_use_chrono branch 9 times, most recently from 4283740 to d82f990CompareDecember 23, 2025 18:14
@rok

rok commented Dec 23, 2025

Copy link
Copy Markdown
MemberAuthor

It seems that std::chrono on GCC (14.3.0, 15.2.0) potentially has a bug that triggers some of our tests. Meanwhile std::chrono on MSVC 19.44 ( 14.44) appears to be pass them and is correct or at least consistent with vendored date.h. I would therefore advise we only switch to std::chrono on MSVC for now as that gives us the most benefit anyway (users no longer have to deal with the tz db).

Below is the explanation and reproduction of the bug.

// GCC libstdc++ DST bug reproduction
//
// The AN to AS Transition Bug
// ---------------------------
// Source https://github.com/eggert/tz/blob/c37fbc3249c1a1334948b38f3bca47dee5c11dd1/australasia#L165-L192
// Australia/Broken_Hill used the AN (New South Wales) rules until 2000, then
// switched to AS (South Australia) rules. Under AN rules, DST started the last
// Sunday of October and ended the last Sunday of March. For the 1999-2000
// summer, DST started October 31, 1999 and would end March 26, 2000. February
// 29, 2000 falls squarely within this DST period, so the correct offset should
// be 9:30 base + 1:00 DST = 10:30 (630 minutes).
//
// Why GCC's Data is Wrong
// -----------------------
// When libstdc++ processes the zone transition from AN rules to AS rules (which
// happens in year 2000), it appears to lose or reset the DST state inherited
// from the AN rules. Instead of recognizing that DST is still active from the
// October 1999 transition, it reports offset=570 (just the 9:30 base) with
// save=0. The inconsistency is evident: it returns abbrev="ACDT" (daylight
// time) but the offset and save values indicate standard time. The AN rules
// clearly show DST should be active until the last Sunday of March 2000.
//
// Compile: g++ -std=c++20 -o gcc_dst_bug gcc_libstdcxx_dst_bug.cpp
// Expected: 630 (10:30 = 9:30 base + 1:00 DST)
// Actual: 570 (9:30 = base only, DST missing)
#include <chrono>
#include <iostream>
int main() {
using namespace std::chrono;
auto* tz = locate_zone("Australia/Broken_Hill");
auto info = tz->get_info(sys_days{2000y / February / 29d} + 23h + 23min + 23s);
std::cout << duration_cast<minutes>(info.offset).count() << "\n";
}

@rok
rok marked this pull request as ready for review December 23, 2025 18:46
@rok

rok commented Dec 23, 2025

Copy link
Copy Markdown
MemberAuthor

@pitrou

@rokrok changed the title GH-48593: [Draft][C++] C++20: use standard calendar / timezone APIsGH-48593: [C++] C++20: use standard calendar / timezone APIsDec 23, 2025
Comment threadcpp/src/arrow/compute/kernels/scalar_temporal_test.cc Outdated
Comment threadcpp/src/arrow/util/chrono_internal.h Outdated
Comment threadcpp/src/arrow/util/chrono_internal.h
@pitrou

Copy link
Copy Markdown
Member

It seems that std::chrono on GCC (14.3.0, 15.2.0) potentially has a bug that triggers some of our tests.

Is the bug reported somewhere? If not, can you do that?

@pitrou

Copy link
Copy Markdown
Member

We possibly have tzdb download set up in CI too and should update it appropriately.

Yes, I think we should do so. There are also a bunch of code snippets in the C++ and Python codebase that could be removed, IIRC.

@rok

rok commented Jan 5, 2026

Copy link
Copy Markdown
MemberAuthor

Is the bug reported somewhere? If not, can you do that?

It seems to be related to a known issue, I added comment explaining our case.

@github-actionsgithub-actionsBot added awaiting changes Awaiting changes awaiting change review Awaiting change review and removed awaiting committer review Awaiting committer review awaiting changes Awaiting changes labels Jan 5, 2026
Comment threadcpp/src/arrow/util/chrono_internal.h Outdated
@github-actionsgithub-actionsBot added awaiting changes Awaiting changes and removed awaiting change review Awaiting change review labels Jan 5, 2026
@rok

rok commented Feb 27, 2026

Copy link
Copy Markdown
MemberAuthor

@github-actions crossbow submit test-r-macos-as-cran

@github-actions

Copy link
Copy Markdown

Revision: 4c5e112

Submitted crossbow builds: ursacomputing/crossbow @ actions-cb3021940b

TaskStatus
test-r-macos-as-cranGitHub Actions

@rok

rok commented Feb 27, 2026

Copy link
Copy Markdown
MemberAuthor

@github-actions crossbow submit test-r-macos-as-cran

@github-actions

Copy link
Copy Markdown

Revision: 9e87d57

Submitted crossbow builds: ursacomputing/crossbow @ actions-a1f6d9bce5

TaskStatus
test-r-macos-as-cranGitHub Actions

@rok

rok commented Feb 27, 2026

Copy link
Copy Markdown
MemberAuthor

I've tried a couple of eebases rebasing on commit before e37c516 succeeded. Trying rebase on 59e0ba6 now. I hope there's not too much to workaround.

@rok

rok commented Feb 27, 2026

Copy link
Copy Markdown
MemberAuthor

@github-actions crossbow submit test-r-macos-as-cran

@github-actions

Copy link
Copy Markdown

Revision: c6caa3c

Submitted crossbow builds: ursacomputing/crossbow @ actions-10e324e6df

TaskStatus
test-r-macos-as-cranGitHub Actions

@rok

rok commented Feb 28, 2026

Copy link
Copy Markdown
MemberAuthor

@jonkeane I rebased to the commit before #49298 and cherrypicked #49223 commit. CRAN CI is now passing. So this PR by itself is above board for CRAN I suppose?

@rok

rok commented Feb 28, 2026

Copy link
Copy Markdown
MemberAuthor

@pitrou since this won't cause issues with CRAN shall we proceed with review?

@rok

rok commented Mar 2, 2026

Copy link
Copy Markdown
MemberAuthor

@github-actions crossbow submit test-r-macos-as-cran

@github-actions

Copy link
Copy Markdown

Revision: a6660df

Submitted crossbow builds: ursacomputing/crossbow @ actions-608e1ed947

TaskStatus
test-r-macos-as-cranGitHub Actions

@rok

rok commented Mar 2, 2026

Copy link
Copy Markdown
MemberAuthor

@github-actions crossbow submit test-r-macos-as-cran

@github-actions

Copy link
Copy Markdown

Revision: aa7aaaf

Submitted crossbow builds: ursacomputing/crossbow @ actions-3ff0f4aa7e

TaskStatus
test-r-macos-as-cranGitHub Actions

@rok

rok commented Mar 2, 2026

Copy link
Copy Markdown
MemberAuthor

@github-actions crossbow submit -g cpp

@github-actions

Copy link
Copy Markdown

Revision: 6ebc076

Submitted crossbow builds: ursacomputing/crossbow @ actions-a0333069ef

TaskStatus
example-cpp-minimal-build-staticGitHub Actions
example-cpp-minimal-build-static-system-dependencyGitHub Actions
example-cpp-tutorialGitHub Actions
test-build-cpp-fuzzGitHub Actions
test-conda-cppGitHub Actions
test-conda-cpp-valgrindGitHub Actions
test-debian-13-cpp-amd64GitHub Actions
test-debian-13-cpp-i386GitHub Actions
test-debian-experimental-cpp-gcc-15GitHub Actions
test-fedora-42-cppGitHub Actions
test-ubuntu-22.04-cppGitHub Actions
test-ubuntu-22.04-cpp-20GitHub Actions
test-ubuntu-22.04-cpp-bundledGitHub Actions
test-ubuntu-22.04-cpp-emscriptenGitHub Actions
test-ubuntu-22.04-cpp-no-threadingGitHub Actions
test-ubuntu-24.04-cppGitHub Actions
test-ubuntu-24.04-cpp-bundled-offlineGitHub Actions
test-ubuntu-24.04-cpp-gcc-13-bundledGitHub Actions
test-ubuntu-24.04-cpp-gcc-14GitHub Actions
test-ubuntu-24.04-cpp-minimal-with-formatsGitHub Actions
test-ubuntu-24.04-cpp-thread-sanitizerGitHub Actions

@rok

rok commented Mar 2, 2026

Copy link
Copy Markdown
MemberAuthor

@github-actions crossbow submit test-r-macos-as-cran

@github-actions

Copy link
Copy Markdown

Revision: 6ebc076

Submitted crossbow builds: ursacomputing/crossbow @ actions-8f1eea3959

TaskStatus
test-r-macos-as-cranGitHub Actions

@rok

rok commented Mar 2, 2026

Copy link
Copy Markdown
MemberAuthor

After rebasing on @jonkeane's #49405 this now seems to pass the CRAN CI.
@pitrou do you think we should get this in for the release?

@rok

rok commented Mar 2, 2026

Copy link
Copy Markdown
MemberAuthor

cc @raulcd

@pitrou

Copy link
Copy Markdown
Member

@rok This PR is fine to me, @raulcd will be the approver here :)

@raulcd

Copy link
Copy Markdown
Member

@github-actions crossbow submit wheel-cp313

@github-actions

Copy link
Copy Markdown

Revision: 6ebc076

Submitted crossbow builds: ursacomputing/crossbow @ actions-7e859b5810

TaskStatus
wheel-macos-monterey-cp313-cp313-amd64GitHub Actions
wheel-macos-monterey-cp313-cp313-arm64GitHub Actions
wheel-macos-monterey-cp313-cp313t-amd64GitHub Actions
wheel-macos-monterey-cp313-cp313t-arm64GitHub Actions
wheel-manylinux-2-28-cp313-cp313-amd64GitHub Actions
wheel-manylinux-2-28-cp313-cp313-arm64GitHub Actions
wheel-manylinux-2-28-cp313-cp313t-amd64GitHub Actions
wheel-manylinux-2-28-cp313-cp313t-arm64GitHub Actions
wheel-musllinux-1-2-cp313-cp313-amd64GitHub Actions
wheel-musllinux-1-2-cp313-cp313-arm64GitHub Actions
wheel-musllinux-1-2-cp313-cp313t-amd64GitHub Actions
wheel-musllinux-1-2-cp313-cp313t-arm64GitHub Actions
wheel-windows-cp313-cp313-amd64GitHub Actions
wheel-windows-cp313-cp313t-amd64GitHub Actions

@raulcdraulcd left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This looks like a great improvement! Thanks @rok !

@rok

rok commented Mar 3, 2026

Copy link
Copy Markdown
MemberAuthor

Thanks for reviews all! I'll keep an eye on the follow-up issue #48743. Feel free to open more if needed.

@conbench-apache-arrow

Copy link
Copy Markdown

After merging your PR, Conbench analyzed the 3 benchmarking runs that have been run so far on merge-commit c48e81e.

There were no benchmark performance regressions. 🎉

The full Conbench report has more details. It also includes information about 7 possible false positives for unstable benchmarks that are known to sometimes produce them.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

8 participants

@rok@pitrou@kou@jonkeane@h-vetinari@raulcd@jorisvandenbossche@thisisnic
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

GH-48593: [C++] C++20: use standard calendar / timezone APIs - #48601

Merged
raulcd merged 1 commit into
apache:mainfrom
rok:cpp20_use_chrono
Mar 3, 2026
Merged

GH-48593: [C++] C++20: use standard calendar / timezone APIs#48601
raulcd merged 1 commit into
apache:mainfrom
rok:cpp20_use_chrono

Conversation

@rok

@rokrok commented Dec 19, 2025

Copy link
Copy Markdown
Member

Rationale for this change

Switch to std::chrono for MSVC to be able to use the system-provided timezone automatically on Windows.

What changes are included in this PR?

This adds chrono_internal.h that uses C++20 std::chrono timezone/calendar APIs on compilers with support (MSVC only for now) and falls back to vendored date.h otherwise.

Are these changes tested?

Partially tested locally and partially to be tested on CI.

Are there any user-facing changes?

Yes, Windows users will no longer need to install the IANA tzdb (see instructions here and here). We possibly have tzdb download set up in CI too and should update it appropriately.

@github-actions

Copy link
Copy Markdown

⚠️ GitHub issue #48593has been automatically assigned in GitHub to PR creator.

@rok
rokforce-pushed the cpp20_use_chrono branch 9 times, most recently from 4283740 to d82f990CompareDecember 23, 2025 18:14
@rok

rok commented Dec 23, 2025

Copy link
Copy Markdown
MemberAuthor

It seems that std::chrono on GCC (14.3.0, 15.2.0) potentially has a bug that triggers some of our tests. Meanwhile std::chrono on MSVC 19.44 ( 14.44) appears to be pass them and is correct or at least consistent with vendored date.h. I would therefore advise we only switch to std::chrono on MSVC for now as that gives us the most benefit anyway (users no longer have to deal with the tz db).

Below is the explanation and reproduction of the bug.

// GCC libstdc++ DST bug reproduction
//
// The AN to AS Transition Bug
// ---------------------------
// Source https://github.com/eggert/tz/blob/c37fbc3249c1a1334948b38f3bca47dee5c11dd1/australasia#L165-L192
// Australia/Broken_Hill used the AN (New South Wales) rules until 2000, then
// switched to AS (South Australia) rules. Under AN rules, DST started the last
// Sunday of October and ended the last Sunday of March. For the 1999-2000
// summer, DST started October 31, 1999 and would end March 26, 2000. February
// 29, 2000 falls squarely within this DST period, so the correct offset should
// be 9:30 base + 1:00 DST = 10:30 (630 minutes).
//
// Why GCC's Data is Wrong
// -----------------------
// When libstdc++ processes the zone transition from AN rules to AS rules (which
// happens in year 2000), it appears to lose or reset the DST state inherited
// from the AN rules. Instead of recognizing that DST is still active from the
// October 1999 transition, it reports offset=570 (just the 9:30 base) with
// save=0. The inconsistency is evident: it returns abbrev="ACDT" (daylight
// time) but the offset and save values indicate standard time. The AN rules
// clearly show DST should be active until the last Sunday of March 2000.
//
// Compile: g++ -std=c++20 -o gcc_dst_bug gcc_libstdcxx_dst_bug.cpp
// Expected: 630 (10:30 = 9:30 base + 1:00 DST)
// Actual: 570 (9:30 = base only, DST missing)
#include <chrono>
#include <iostream>
int main() {
using namespace std::chrono;
auto* tz = locate_zone("Australia/Broken_Hill");
auto info = tz->get_info(sys_days{2000y / February / 29d} + 23h + 23min + 23s);
std::cout << duration_cast<minutes>(info.offset).count() << "\n";
}

@rok
rok marked this pull request as ready for review December 23, 2025 18:46
@rok

rok commented Dec 23, 2025

Copy link
Copy Markdown
MemberAuthor

@pitrou

@rokrok changed the title GH-48593: [Draft][C++] C++20: use standard calendar / timezone APIsGH-48593: [C++] C++20: use standard calendar / timezone APIsDec 23, 2025
Comment threadcpp/src/arrow/compute/kernels/scalar_temporal_test.cc Outdated
Comment threadcpp/src/arrow/util/chrono_internal.h Outdated
Comment threadcpp/src/arrow/util/chrono_internal.h
@pitrou

Copy link
Copy Markdown
Member

It seems that std::chrono on GCC (14.3.0, 15.2.0) potentially has a bug that triggers some of our tests.

Is the bug reported somewhere? If not, can you do that?

@pitrou

Copy link
Copy Markdown
Member

We possibly have tzdb download set up in CI too and should update it appropriately.

Yes, I think we should do so. There are also a bunch of code snippets in the C++ and Python codebase that could be removed, IIRC.

@rok

rok commented Jan 5, 2026

Copy link
Copy Markdown
MemberAuthor

Is the bug reported somewhere? If not, can you do that?

It seems to be related to a known issue, I added comment explaining our case.

@github-actionsgithub-actionsBot added awaiting changes Awaiting changes awaiting change review Awaiting change review and removed awaiting committer review Awaiting committer review awaiting changes Awaiting changes labels Jan 5, 2026
Comment threadcpp/src/arrow/util/chrono_internal.h Outdated
@github-actionsgithub-actionsBot added awaiting changes Awaiting changes and removed awaiting change review Awaiting change review labels Jan 5, 2026
@rok

rok commented Feb 27, 2026

Copy link
Copy Markdown
MemberAuthor

@github-actions crossbow submit test-r-macos-as-cran

@github-actions

Copy link
Copy Markdown

Revision: 4c5e112

Submitted crossbow builds: ursacomputing/crossbow @ actions-cb3021940b

TaskStatus
test-r-macos-as-cranGitHub Actions

@rok

rok commented Feb 27, 2026

Copy link
Copy Markdown
MemberAuthor

@github-actions crossbow submit test-r-macos-as-cran

@github-actions

Copy link
Copy Markdown

Revision: 9e87d57

Submitted crossbow builds: ursacomputing/crossbow @ actions-a1f6d9bce5

TaskStatus
test-r-macos-as-cranGitHub Actions

@rok

rok commented Feb 27, 2026

Copy link
Copy Markdown
MemberAuthor

I've tried a couple of eebases rebasing on commit before e37c516 succeeded. Trying rebase on 59e0ba6 now. I hope there's not too much to workaround.

@rok

rok commented Feb 27, 2026

Copy link
Copy Markdown
MemberAuthor

@github-actions crossbow submit test-r-macos-as-cran

@github-actions

Copy link
Copy Markdown

Revision: c6caa3c

Submitted crossbow builds: ursacomputing/crossbow @ actions-10e324e6df

TaskStatus
test-r-macos-as-cranGitHub Actions

@rok

rok commented Feb 28, 2026

Copy link
Copy Markdown
MemberAuthor

@jonkeane I rebased to the commit before #49298 and cherrypicked #49223 commit. CRAN CI is now passing. So this PR by itself is above board for CRAN I suppose?

@rok

rok commented Feb 28, 2026

Copy link
Copy Markdown
MemberAuthor

@pitrou since this won't cause issues with CRAN shall we proceed with review?

@rok

rok commented Mar 2, 2026

Copy link
Copy Markdown
MemberAuthor

@github-actions crossbow submit test-r-macos-as-cran

@github-actions

Copy link
Copy Markdown

Revision: a6660df

Submitted crossbow builds: ursacomputing/crossbow @ actions-608e1ed947

TaskStatus
test-r-macos-as-cranGitHub Actions

@rok

rok commented Mar 2, 2026

Copy link
Copy Markdown
MemberAuthor

@github-actions crossbow submit test-r-macos-as-cran

@github-actions

Copy link
Copy Markdown

Revision: aa7aaaf

Submitted crossbow builds: ursacomputing/crossbow @ actions-3ff0f4aa7e

TaskStatus
test-r-macos-as-cranGitHub Actions

@rok

rok commented Mar 2, 2026

Copy link
Copy Markdown
MemberAuthor

@github-actions crossbow submit -g cpp

@github-actions

Copy link
Copy Markdown

Revision: 6ebc076

Submitted crossbow builds: ursacomputing/crossbow @ actions-a0333069ef

TaskStatus
example-cpp-minimal-build-staticGitHub Actions
example-cpp-minimal-build-static-system-dependencyGitHub Actions
example-cpp-tutorialGitHub Actions
test-build-cpp-fuzzGitHub Actions
test-conda-cppGitHub Actions
test-conda-cpp-valgrindGitHub Actions
test-debian-13-cpp-amd64GitHub Actions
test-debian-13-cpp-i386GitHub Actions
test-debian-experimental-cpp-gcc-15GitHub Actions
test-fedora-42-cppGitHub Actions
test-ubuntu-22.04-cppGitHub Actions
test-ubuntu-22.04-cpp-20GitHub Actions
test-ubuntu-22.04-cpp-bundledGitHub Actions
test-ubuntu-22.04-cpp-emscriptenGitHub Actions
test-ubuntu-22.04-cpp-no-threadingGitHub Actions
test-ubuntu-24.04-cppGitHub Actions
test-ubuntu-24.04-cpp-bundled-offlineGitHub Actions
test-ubuntu-24.04-cpp-gcc-13-bundledGitHub Actions
test-ubuntu-24.04-cpp-gcc-14GitHub Actions
test-ubuntu-24.04-cpp-minimal-with-formatsGitHub Actions
test-ubuntu-24.04-cpp-thread-sanitizerGitHub Actions

@rok

rok commented Mar 2, 2026

Copy link
Copy Markdown
MemberAuthor

@github-actions crossbow submit test-r-macos-as-cran

@github-actions

Copy link
Copy Markdown

Revision: 6ebc076

Submitted crossbow builds: ursacomputing/crossbow @ actions-8f1eea3959

TaskStatus
test-r-macos-as-cranGitHub Actions

@rok

rok commented Mar 2, 2026

Copy link
Copy Markdown
MemberAuthor

After rebasing on @jonkeane's #49405 this now seems to pass the CRAN CI.
@pitrou do you think we should get this in for the release?

@rok

rok commented Mar 2, 2026

Copy link
Copy Markdown
MemberAuthor

cc @raulcd

@pitrou

Copy link
Copy Markdown
Member

@rok This PR is fine to me, @raulcd will be the approver here :)

@raulcd

Copy link
Copy Markdown
Member

@github-actions crossbow submit wheel-cp313

@github-actions

Copy link
Copy Markdown

Revision: 6ebc076

Submitted crossbow builds: ursacomputing/crossbow @ actions-7e859b5810

TaskStatus
wheel-macos-monterey-cp313-cp313-amd64GitHub Actions
wheel-macos-monterey-cp313-cp313-arm64GitHub Actions
wheel-macos-monterey-cp313-cp313t-amd64GitHub Actions
wheel-macos-monterey-cp313-cp313t-arm64GitHub Actions
wheel-manylinux-2-28-cp313-cp313-amd64GitHub Actions
wheel-manylinux-2-28-cp313-cp313-arm64GitHub Actions
wheel-manylinux-2-28-cp313-cp313t-amd64GitHub Actions
wheel-manylinux-2-28-cp313-cp313t-arm64GitHub Actions
wheel-musllinux-1-2-cp313-cp313-amd64GitHub Actions
wheel-musllinux-1-2-cp313-cp313-arm64GitHub Actions
wheel-musllinux-1-2-cp313-cp313t-amd64GitHub Actions
wheel-musllinux-1-2-cp313-cp313t-arm64GitHub Actions
wheel-windows-cp313-cp313-amd64GitHub Actions
wheel-windows-cp313-cp313t-amd64GitHub Actions

@raulcdraulcd left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This looks like a great improvement! Thanks @rok !

@rok

rok commented Mar 3, 2026

Copy link
Copy Markdown
MemberAuthor

Thanks for reviews all! I'll keep an eye on the follow-up issue #48743. Feel free to open more if needed.

@conbench-apache-arrow

Copy link
Copy Markdown

After merging your PR, Conbench analyzed the 3 benchmarking runs that have been run so far on merge-commit c48e81e.

There were no benchmark performance regressions. 🎉

The full Conbench report has more details. It also includes information about 7 possible false positives for unstable benchmarks that are known to sometimes produce them.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

8 participants

@rok@pitrou@kou@jonkeane@h-vetinari@raulcd@jorisvandenbossche@thisisnic
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

GH-48593: [C++] C++20: use standard calendar / timezone APIs - #48601

Merged
raulcd merged 1 commit into
apache:mainfrom
rok:cpp20_use_chrono
Mar 3, 2026
Merged

GH-48593: [C++] C++20: use standard calendar / timezone APIs#48601
raulcd merged 1 commit into
apache:mainfrom
rok:cpp20_use_chrono

Conversation

@rok

@rokrok commented Dec 19, 2025

Copy link
Copy Markdown
Member

Rationale for this change

Switch to std::chrono for MSVC to be able to use the system-provided timezone automatically on Windows.

What changes are included in this PR?

This adds chrono_internal.h that uses C++20 std::chrono timezone/calendar APIs on compilers with support (MSVC only for now) and falls back to vendored date.h otherwise.

Are these changes tested?

Partially tested locally and partially to be tested on CI.

Are there any user-facing changes?

Yes, Windows users will no longer need to install the IANA tzdb (see instructions here and here). We possibly have tzdb download set up in CI too and should update it appropriately.

@github-actions

Copy link
Copy Markdown

⚠️ GitHub issue #48593has been automatically assigned in GitHub to PR creator.

@rok
rokforce-pushed the cpp20_use_chrono branch 9 times, most recently from 4283740 to d82f990CompareDecember 23, 2025 18:14
@rok

rok commented Dec 23, 2025

Copy link
Copy Markdown
MemberAuthor

It seems that std::chrono on GCC (14.3.0, 15.2.0) potentially has a bug that triggers some of our tests. Meanwhile std::chrono on MSVC 19.44 ( 14.44) appears to be pass them and is correct or at least consistent with vendored date.h. I would therefore advise we only switch to std::chrono on MSVC for now as that gives us the most benefit anyway (users no longer have to deal with the tz db).

Below is the explanation and reproduction of the bug.

// GCC libstdc++ DST bug reproduction
//
// The AN to AS Transition Bug
// ---------------------------
// Source https://github.com/eggert/tz/blob/c37fbc3249c1a1334948b38f3bca47dee5c11dd1/australasia#L165-L192
// Australia/Broken_Hill used the AN (New South Wales) rules until 2000, then
// switched to AS (South Australia) rules. Under AN rules, DST started the last
// Sunday of October and ended the last Sunday of March. For the 1999-2000
// summer, DST started October 31, 1999 and would end March 26, 2000. February
// 29, 2000 falls squarely within this DST period, so the correct offset should
// be 9:30 base + 1:00 DST = 10:30 (630 minutes).
//
// Why GCC's Data is Wrong
// -----------------------
// When libstdc++ processes the zone transition from AN rules to AS rules (which
// happens in year 2000), it appears to lose or reset the DST state inherited
// from the AN rules. Instead of recognizing that DST is still active from the
// October 1999 transition, it reports offset=570 (just the 9:30 base) with
// save=0. The inconsistency is evident: it returns abbrev="ACDT" (daylight
// time) but the offset and save values indicate standard time. The AN rules
// clearly show DST should be active until the last Sunday of March 2000.
//
// Compile: g++ -std=c++20 -o gcc_dst_bug gcc_libstdcxx_dst_bug.cpp
// Expected: 630 (10:30 = 9:30 base + 1:00 DST)
// Actual: 570 (9:30 = base only, DST missing)
#include <chrono>
#include <iostream>
int main() {
using namespace std::chrono;
auto* tz = locate_zone("Australia/Broken_Hill");
auto info = tz->get_info(sys_days{2000y / February / 29d} + 23h + 23min + 23s);
std::cout << duration_cast<minutes>(info.offset).count() << "\n";
}

@rok
rok marked this pull request as ready for review December 23, 2025 18:46
@rok

rok commented Dec 23, 2025

Copy link
Copy Markdown
MemberAuthor

@pitrou

@rokrok changed the title GH-48593: [Draft][C++] C++20: use standard calendar / timezone APIsGH-48593: [C++] C++20: use standard calendar / timezone APIsDec 23, 2025
Comment threadcpp/src/arrow/compute/kernels/scalar_temporal_test.cc Outdated
Comment threadcpp/src/arrow/util/chrono_internal.h Outdated
Comment threadcpp/src/arrow/util/chrono_internal.h
@pitrou

Copy link
Copy Markdown
Member

It seems that std::chrono on GCC (14.3.0, 15.2.0) potentially has a bug that triggers some of our tests.

Is the bug reported somewhere? If not, can you do that?

@pitrou

Copy link
Copy Markdown
Member

We possibly have tzdb download set up in CI too and should update it appropriately.

Yes, I think we should do so. There are also a bunch of code snippets in the C++ and Python codebase that could be removed, IIRC.

@rok

rok commented Jan 5, 2026

Copy link
Copy Markdown
MemberAuthor

Is the bug reported somewhere? If not, can you do that?

It seems to be related to a known issue, I added comment explaining our case.

@github-actionsgithub-actionsBot added awaiting changes Awaiting changes awaiting change review Awaiting change review and removed awaiting committer review Awaiting committer review awaiting changes Awaiting changes labels Jan 5, 2026
Comment threadcpp/src/arrow/util/chrono_internal.h Outdated
@github-actionsgithub-actionsBot added awaiting changes Awaiting changes and removed awaiting change review Awaiting change review labels Jan 5, 2026
@rok

rok commented Feb 27, 2026

Copy link
Copy Markdown
MemberAuthor

@github-actions crossbow submit test-r-macos-as-cran

@github-actions

Copy link
Copy Markdown

Revision: 4c5e112

Submitted crossbow builds: ursacomputing/crossbow @ actions-cb3021940b

TaskStatus
test-r-macos-as-cranGitHub Actions

@rok

rok commented Feb 27, 2026

Copy link
Copy Markdown
MemberAuthor

@github-actions crossbow submit test-r-macos-as-cran

@github-actions

Copy link
Copy Markdown

Revision: 9e87d57

Submitted crossbow builds: ursacomputing/crossbow @ actions-a1f6d9bce5

TaskStatus
test-r-macos-as-cranGitHub Actions

@rok

rok commented Feb 27, 2026

Copy link
Copy Markdown
MemberAuthor

I've tried a couple of eebases rebasing on commit before e37c516 succeeded. Trying rebase on 59e0ba6 now. I hope there's not too much to workaround.

@rok

rok commented Feb 27, 2026

Copy link
Copy Markdown
MemberAuthor

@github-actions crossbow submit test-r-macos-as-cran

@github-actions

Copy link
Copy Markdown

Revision: c6caa3c

Submitted crossbow builds: ursacomputing/crossbow @ actions-10e324e6df

TaskStatus
test-r-macos-as-cranGitHub Actions

@rok

rok commented Feb 28, 2026

Copy link
Copy Markdown
MemberAuthor

@jonkeane I rebased to the commit before #49298 and cherrypicked #49223 commit. CRAN CI is now passing. So this PR by itself is above board for CRAN I suppose?

@rok

rok commented Feb 28, 2026

Copy link
Copy Markdown
MemberAuthor

@pitrou since this won't cause issues with CRAN shall we proceed with review?

@rok

rok commented Mar 2, 2026

Copy link
Copy Markdown
MemberAuthor

@github-actions crossbow submit test-r-macos-as-cran

@github-actions

Copy link
Copy Markdown

Revision: a6660df

Submitted crossbow builds: ursacomputing/crossbow @ actions-608e1ed947

TaskStatus
test-r-macos-as-cranGitHub Actions

@rok

rok commented Mar 2, 2026

Copy link
Copy Markdown
MemberAuthor

@github-actions crossbow submit test-r-macos-as-cran

@github-actions

Copy link
Copy Markdown

Revision: aa7aaaf

Submitted crossbow builds: ursacomputing/crossbow @ actions-3ff0f4aa7e

TaskStatus
test-r-macos-as-cranGitHub Actions

@rok

rok commented Mar 2, 2026

Copy link
Copy Markdown
MemberAuthor

@github-actions crossbow submit -g cpp

@github-actions

Copy link
Copy Markdown

Revision: 6ebc076

Submitted crossbow builds: ursacomputing/crossbow @ actions-a0333069ef

TaskStatus
example-cpp-minimal-build-staticGitHub Actions
example-cpp-minimal-build-static-system-dependencyGitHub Actions
example-cpp-tutorialGitHub Actions
test-build-cpp-fuzzGitHub Actions
test-conda-cppGitHub Actions
test-conda-cpp-valgrindGitHub Actions
test-debian-13-cpp-amd64GitHub Actions
test-debian-13-cpp-i386GitHub Actions
test-debian-experimental-cpp-gcc-15GitHub Actions
test-fedora-42-cppGitHub Actions
test-ubuntu-22.04-cppGitHub Actions
test-ubuntu-22.04-cpp-20GitHub Actions
test-ubuntu-22.04-cpp-bundledGitHub Actions
test-ubuntu-22.04-cpp-emscriptenGitHub Actions
test-ubuntu-22.04-cpp-no-threadingGitHub Actions
test-ubuntu-24.04-cppGitHub Actions
test-ubuntu-24.04-cpp-bundled-offlineGitHub Actions
test-ubuntu-24.04-cpp-gcc-13-bundledGitHub Actions
test-ubuntu-24.04-cpp-gcc-14GitHub Actions
test-ubuntu-24.04-cpp-minimal-with-formatsGitHub Actions
test-ubuntu-24.04-cpp-thread-sanitizerGitHub Actions

@rok

rok commented Mar 2, 2026

Copy link
Copy Markdown
MemberAuthor

@github-actions crossbow submit test-r-macos-as-cran

@github-actions

Copy link
Copy Markdown

Revision: 6ebc076

Submitted crossbow builds: ursacomputing/crossbow @ actions-8f1eea3959

TaskStatus
test-r-macos-as-cranGitHub Actions

@rok

rok commented Mar 2, 2026

Copy link
Copy Markdown
MemberAuthor

After rebasing on @jonkeane's #49405 this now seems to pass the CRAN CI.
@pitrou do you think we should get this in for the release?

@rok

rok commented Mar 2, 2026

Copy link
Copy Markdown
MemberAuthor

cc @raulcd

@pitrou

Copy link
Copy Markdown
Member

@rok This PR is fine to me, @raulcd will be the approver here :)

@raulcd

Copy link
Copy Markdown
Member

@github-actions crossbow submit wheel-cp313

@github-actions

Copy link
Copy Markdown

Revision: 6ebc076

Submitted crossbow builds: ursacomputing/crossbow @ actions-7e859b5810

TaskStatus
wheel-macos-monterey-cp313-cp313-amd64GitHub Actions
wheel-macos-monterey-cp313-cp313-arm64GitHub Actions
wheel-macos-monterey-cp313-cp313t-amd64GitHub Actions
wheel-macos-monterey-cp313-cp313t-arm64GitHub Actions
wheel-manylinux-2-28-cp313-cp313-amd64GitHub Actions
wheel-manylinux-2-28-cp313-cp313-arm64GitHub Actions
wheel-manylinux-2-28-cp313-cp313t-amd64GitHub Actions
wheel-manylinux-2-28-cp313-cp313t-arm64GitHub Actions
wheel-musllinux-1-2-cp313-cp313-amd64GitHub Actions
wheel-musllinux-1-2-cp313-cp313-arm64GitHub Actions
wheel-musllinux-1-2-cp313-cp313t-amd64GitHub Actions
wheel-musllinux-1-2-cp313-cp313t-arm64GitHub Actions
wheel-windows-cp313-cp313-amd64GitHub Actions
wheel-windows-cp313-cp313t-amd64GitHub Actions

@raulcdraulcd left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This looks like a great improvement! Thanks @rok !

@rok

rok commented Mar 3, 2026

Copy link
Copy Markdown
MemberAuthor

Thanks for reviews all! I'll keep an eye on the follow-up issue #48743. Feel free to open more if needed.

@conbench-apache-arrow

Copy link
Copy Markdown

After merging your PR, Conbench analyzed the 3 benchmarking runs that have been run so far on merge-commit c48e81e.

There were no benchmark performance regressions. 🎉

The full Conbench report has more details. It also includes information about 7 possible false positives for unstable benchmarks that are known to sometimes produce them.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

8 participants

@rok@pitrou@kou@jonkeane@h-vetinari@raulcd@jorisvandenbossche@thisisnic
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

GH-48593: [C++] C++20: use standard calendar / timezone APIs - #48601

Merged
raulcd merged 1 commit into
apache:mainfrom
rok:cpp20_use_chrono
Mar 3, 2026
Merged

GH-48593: [C++] C++20: use standard calendar / timezone APIs#48601
raulcd merged 1 commit into
apache:mainfrom
rok:cpp20_use_chrono

Conversation

@rok

@rokrok commented Dec 19, 2025

Copy link
Copy Markdown
Member

Rationale for this change

Switch to std::chrono for MSVC to be able to use the system-provided timezone automatically on Windows.

What changes are included in this PR?

This adds chrono_internal.h that uses C++20 std::chrono timezone/calendar APIs on compilers with support (MSVC only for now) and falls back to vendored date.h otherwise.

Are these changes tested?

Partially tested locally and partially to be tested on CI.

Are there any user-facing changes?

Yes, Windows users will no longer need to install the IANA tzdb (see instructions here and here). We possibly have tzdb download set up in CI too and should update it appropriately.

@github-actions

Copy link
Copy Markdown

⚠️ GitHub issue #48593has been automatically assigned in GitHub to PR creator.

@rok
rokforce-pushed the cpp20_use_chrono branch 9 times, most recently from 4283740 to d82f990CompareDecember 23, 2025 18:14
@rok

rok commented Dec 23, 2025

Copy link
Copy Markdown
MemberAuthor

It seems that std::chrono on GCC (14.3.0, 15.2.0) potentially has a bug that triggers some of our tests. Meanwhile std::chrono on MSVC 19.44 ( 14.44) appears to be pass them and is correct or at least consistent with vendored date.h. I would therefore advise we only switch to std::chrono on MSVC for now as that gives us the most benefit anyway (users no longer have to deal with the tz db).

Below is the explanation and reproduction of the bug.

// GCC libstdc++ DST bug reproduction
//
// The AN to AS Transition Bug
// ---------------------------
// Source https://github.com/eggert/tz/blob/c37fbc3249c1a1334948b38f3bca47dee5c11dd1/australasia#L165-L192
// Australia/Broken_Hill used the AN (New South Wales) rules until 2000, then
// switched to AS (South Australia) rules. Under AN rules, DST started the last
// Sunday of October and ended the last Sunday of March. For the 1999-2000
// summer, DST started October 31, 1999 and would end March 26, 2000. February
// 29, 2000 falls squarely within this DST period, so the correct offset should
// be 9:30 base + 1:00 DST = 10:30 (630 minutes).
//
// Why GCC's Data is Wrong
// -----------------------
// When libstdc++ processes the zone transition from AN rules to AS rules (which
// happens in year 2000), it appears to lose or reset the DST state inherited
// from the AN rules. Instead of recognizing that DST is still active from the
// October 1999 transition, it reports offset=570 (just the 9:30 base) with
// save=0. The inconsistency is evident: it returns abbrev="ACDT" (daylight
// time) but the offset and save values indicate standard time. The AN rules
// clearly show DST should be active until the last Sunday of March 2000.
//
// Compile: g++ -std=c++20 -o gcc_dst_bug gcc_libstdcxx_dst_bug.cpp
// Expected: 630 (10:30 = 9:30 base + 1:00 DST)
// Actual: 570 (9:30 = base only, DST missing)
#include <chrono>
#include <iostream>
int main() {
using namespace std::chrono;
auto* tz = locate_zone("Australia/Broken_Hill");
auto info = tz->get_info(sys_days{2000y / February / 29d} + 23h + 23min + 23s);
std::cout << duration_cast<minutes>(info.offset).count() << "\n";
}

@rok
rok marked this pull request as ready for review December 23, 2025 18:46
@rok

rok commented Dec 23, 2025

Copy link
Copy Markdown
MemberAuthor

@pitrou

@rokrok changed the title GH-48593: [Draft][C++] C++20: use standard calendar / timezone APIsGH-48593: [C++] C++20: use standard calendar / timezone APIsDec 23, 2025
Comment threadcpp/src/arrow/compute/kernels/scalar_temporal_test.cc Outdated
Comment threadcpp/src/arrow/util/chrono_internal.h Outdated
Comment threadcpp/src/arrow/util/chrono_internal.h
@pitrou

Copy link
Copy Markdown
Member

It seems that std::chrono on GCC (14.3.0, 15.2.0) potentially has a bug that triggers some of our tests.

Is the bug reported somewhere? If not, can you do that?

@pitrou

Copy link
Copy Markdown
Member

We possibly have tzdb download set up in CI too and should update it appropriately.

Yes, I think we should do so. There are also a bunch of code snippets in the C++ and Python codebase that could be removed, IIRC.

@rok

rok commented Jan 5, 2026

Copy link
Copy Markdown
MemberAuthor

Is the bug reported somewhere? If not, can you do that?

It seems to be related to a known issue, I added comment explaining our case.

@github-actionsgithub-actionsBot added awaiting changes Awaiting changes awaiting change review Awaiting change review and removed awaiting committer review Awaiting committer review awaiting changes Awaiting changes labels Jan 5, 2026
Comment threadcpp/src/arrow/util/chrono_internal.h Outdated
@github-actionsgithub-actionsBot added awaiting changes Awaiting changes and removed awaiting change review Awaiting change review labels Jan 5, 2026
@rok

rok commented Feb 27, 2026

Copy link
Copy Markdown
MemberAuthor

@github-actions crossbow submit test-r-macos-as-cran

@github-actions

Copy link
Copy Markdown

Revision: 4c5e112

Submitted crossbow builds: ursacomputing/crossbow @ actions-cb3021940b

TaskStatus
test-r-macos-as-cranGitHub Actions

@rok

rok commented Feb 27, 2026

Copy link
Copy Markdown
MemberAuthor

@github-actions crossbow submit test-r-macos-as-cran

@github-actions

Copy link
Copy Markdown

Revision: 9e87d57

Submitted crossbow builds: ursacomputing/crossbow @ actions-a1f6d9bce5

TaskStatus
test-r-macos-as-cranGitHub Actions

@rok

rok commented Feb 27, 2026

Copy link
Copy Markdown
MemberAuthor

I've tried a couple of eebases rebasing on commit before e37c516 succeeded. Trying rebase on 59e0ba6 now. I hope there's not too much to workaround.

@rok

rok commented Feb 27, 2026

Copy link
Copy Markdown
MemberAuthor

@github-actions crossbow submit test-r-macos-as-cran

@github-actions

Copy link
Copy Markdown

Revision: c6caa3c

Submitted crossbow builds: ursacomputing/crossbow @ actions-10e324e6df

TaskStatus
test-r-macos-as-cranGitHub Actions

@rok

rok commented Feb 28, 2026

Copy link
Copy Markdown
MemberAuthor

@jonkeane I rebased to the commit before #49298 and cherrypicked #49223 commit. CRAN CI is now passing. So this PR by itself is above board for CRAN I suppose?

@rok

rok commented Feb 28, 2026

Copy link
Copy Markdown
MemberAuthor

@pitrou since this won't cause issues with CRAN shall we proceed with review?

@rok

rok commented Mar 2, 2026

Copy link
Copy Markdown
MemberAuthor

@github-actions crossbow submit test-r-macos-as-cran

@github-actions

Copy link
Copy Markdown

Revision: a6660df

Submitted crossbow builds: ursacomputing/crossbow @ actions-608e1ed947

TaskStatus
test-r-macos-as-cranGitHub Actions

@rok

rok commented Mar 2, 2026

Copy link
Copy Markdown
MemberAuthor

@github-actions crossbow submit test-r-macos-as-cran

@github-actions

Copy link
Copy Markdown

Revision: aa7aaaf

Submitted crossbow builds: ursacomputing/crossbow @ actions-3ff0f4aa7e

TaskStatus
test-r-macos-as-cranGitHub Actions

@rok

rok commented Mar 2, 2026

Copy link
Copy Markdown
MemberAuthor

@github-actions crossbow submit -g cpp

@github-actions

Copy link
Copy Markdown

Revision: 6ebc076

Submitted crossbow builds: ursacomputing/crossbow @ actions-a0333069ef

TaskStatus
example-cpp-minimal-build-staticGitHub Actions
example-cpp-minimal-build-static-system-dependencyGitHub Actions
example-cpp-tutorialGitHub Actions
test-build-cpp-fuzzGitHub Actions
test-conda-cppGitHub Actions
test-conda-cpp-valgrindGitHub Actions
test-debian-13-cpp-amd64GitHub Actions
test-debian-13-cpp-i386GitHub Actions
test-debian-experimental-cpp-gcc-15GitHub Actions
test-fedora-42-cppGitHub Actions
test-ubuntu-22.04-cppGitHub Actions
test-ubuntu-22.04-cpp-20GitHub Actions
test-ubuntu-22.04-cpp-bundledGitHub Actions
test-ubuntu-22.04-cpp-emscriptenGitHub Actions
test-ubuntu-22.04-cpp-no-threadingGitHub Actions
test-ubuntu-24.04-cppGitHub Actions
test-ubuntu-24.04-cpp-bundled-offlineGitHub Actions
test-ubuntu-24.04-cpp-gcc-13-bundledGitHub Actions
test-ubuntu-24.04-cpp-gcc-14GitHub Actions
test-ubuntu-24.04-cpp-minimal-with-formatsGitHub Actions
test-ubuntu-24.04-cpp-thread-sanitizerGitHub Actions

@rok

rok commented Mar 2, 2026

Copy link
Copy Markdown
MemberAuthor

@github-actions crossbow submit test-r-macos-as-cran

@github-actions

Copy link
Copy Markdown

Revision: 6ebc076

Submitted crossbow builds: ursacomputing/crossbow @ actions-8f1eea3959

TaskStatus
test-r-macos-as-cranGitHub Actions

@rok

rok commented Mar 2, 2026

Copy link
Copy Markdown
MemberAuthor

After rebasing on @jonkeane's #49405 this now seems to pass the CRAN CI.
@pitrou do you think we should get this in for the release?

@rok

rok commented Mar 2, 2026

Copy link
Copy Markdown
MemberAuthor

cc @raulcd

@pitrou

Copy link
Copy Markdown
Member

@rok This PR is fine to me, @raulcd will be the approver here :)

@raulcd

Copy link
Copy Markdown
Member

@github-actions crossbow submit wheel-cp313

@github-actions

Copy link
Copy Markdown

Revision: 6ebc076

Submitted crossbow builds: ursacomputing/crossbow @ actions-7e859b5810

TaskStatus
wheel-macos-monterey-cp313-cp313-amd64GitHub Actions
wheel-macos-monterey-cp313-cp313-arm64GitHub Actions
wheel-macos-monterey-cp313-cp313t-amd64GitHub Actions
wheel-macos-monterey-cp313-cp313t-arm64GitHub Actions
wheel-manylinux-2-28-cp313-cp313-amd64GitHub Actions
wheel-manylinux-2-28-cp313-cp313-arm64GitHub Actions
wheel-manylinux-2-28-cp313-cp313t-amd64GitHub Actions
wheel-manylinux-2-28-cp313-cp313t-arm64GitHub Actions
wheel-musllinux-1-2-cp313-cp313-amd64GitHub Actions
wheel-musllinux-1-2-cp313-cp313-arm64GitHub Actions
wheel-musllinux-1-2-cp313-cp313t-amd64GitHub Actions
wheel-musllinux-1-2-cp313-cp313t-arm64GitHub Actions
wheel-windows-cp313-cp313-amd64GitHub Actions
wheel-windows-cp313-cp313t-amd64GitHub Actions

@raulcdraulcd left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This looks like a great improvement! Thanks @rok !

@rok

rok commented Mar 3, 2026

Copy link
Copy Markdown
MemberAuthor

Thanks for reviews all! I'll keep an eye on the follow-up issue #48743. Feel free to open more if needed.

@conbench-apache-arrow

Copy link
Copy Markdown

After merging your PR, Conbench analyzed the 3 benchmarking runs that have been run so far on merge-commit c48e81e.

There were no benchmark performance regressions. 🎉

The full Conbench report has more details. It also includes information about 7 possible false positives for unstable benchmarks that are known to sometimes produce them.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

8 participants

@rok@pitrou@kou@jonkeane@h-vetinari@raulcd@jorisvandenbossche@thisisnic
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

GH-48593: [C++] C++20: use standard calendar / timezone APIs - #48601

Merged
raulcd merged 1 commit into
apache:mainfrom
rok:cpp20_use_chrono
Mar 3, 2026
Merged

GH-48593: [C++] C++20: use standard calendar / timezone APIs#48601
raulcd merged 1 commit into
apache:mainfrom
rok:cpp20_use_chrono

Conversation

@rok

@rokrok commented Dec 19, 2025

Copy link
Copy Markdown
Member

Rationale for this change

Switch to std::chrono for MSVC to be able to use the system-provided timezone automatically on Windows.

What changes are included in this PR?

This adds chrono_internal.h that uses C++20 std::chrono timezone/calendar APIs on compilers with support (MSVC only for now) and falls back to vendored date.h otherwise.

Are these changes tested?

Partially tested locally and partially to be tested on CI.

Are there any user-facing changes?

Yes, Windows users will no longer need to install the IANA tzdb (see instructions here and here). We possibly have tzdb download set up in CI too and should update it appropriately.

@github-actions

Copy link
Copy Markdown

⚠️ GitHub issue #48593has been automatically assigned in GitHub to PR creator.

@rok
rokforce-pushed the cpp20_use_chrono branch 9 times, most recently from 4283740 to d82f990CompareDecember 23, 2025 18:14
@rok

rok commented Dec 23, 2025

Copy link
Copy Markdown
MemberAuthor

It seems that std::chrono on GCC (14.3.0, 15.2.0) potentially has a bug that triggers some of our tests. Meanwhile std::chrono on MSVC 19.44 ( 14.44) appears to be pass them and is correct or at least consistent with vendored date.h. I would therefore advise we only switch to std::chrono on MSVC for now as that gives us the most benefit anyway (users no longer have to deal with the tz db).

Below is the explanation and reproduction of the bug.

// GCC libstdc++ DST bug reproduction
//
// The AN to AS Transition Bug
// ---------------------------
// Source https://github.com/eggert/tz/blob/c37fbc3249c1a1334948b38f3bca47dee5c11dd1/australasia#L165-L192
// Australia/Broken_Hill used the AN (New South Wales) rules until 2000, then
// switched to AS (South Australia) rules. Under AN rules, DST started the last
// Sunday of October and ended the last Sunday of March. For the 1999-2000
// summer, DST started October 31, 1999 and would end March 26, 2000. February
// 29, 2000 falls squarely within this DST period, so the correct offset should
// be 9:30 base + 1:00 DST = 10:30 (630 minutes).
//
// Why GCC's Data is Wrong
// -----------------------
// When libstdc++ processes the zone transition from AN rules to AS rules (which
// happens in year 2000), it appears to lose or reset the DST state inherited
// from the AN rules. Instead of recognizing that DST is still active from the
// October 1999 transition, it reports offset=570 (just the 9:30 base) with
// save=0. The inconsistency is evident: it returns abbrev="ACDT" (daylight
// time) but the offset and save values indicate standard time. The AN rules
// clearly show DST should be active until the last Sunday of March 2000.
//
// Compile: g++ -std=c++20 -o gcc_dst_bug gcc_libstdcxx_dst_bug.cpp
// Expected: 630 (10:30 = 9:30 base + 1:00 DST)
// Actual: 570 (9:30 = base only, DST missing)
#include <chrono>
#include <iostream>
int main() {
using namespace std::chrono;
auto* tz = locate_zone("Australia/Broken_Hill");
auto info = tz->get_info(sys_days{2000y / February / 29d} + 23h + 23min + 23s);
std::cout << duration_cast<minutes>(info.offset).count() << "\n";
}

@rok
rok marked this pull request as ready for review December 23, 2025 18:46
@rok

rok commented Dec 23, 2025

Copy link
Copy Markdown
MemberAuthor

@pitrou

@rokrok changed the title GH-48593: [Draft][C++] C++20: use standard calendar / timezone APIsGH-48593: [C++] C++20: use standard calendar / timezone APIsDec 23, 2025
Comment threadcpp/src/arrow/compute/kernels/scalar_temporal_test.cc Outdated
Comment threadcpp/src/arrow/util/chrono_internal.h Outdated
Comment threadcpp/src/arrow/util/chrono_internal.h
@pitrou

Copy link
Copy Markdown
Member

It seems that std::chrono on GCC (14.3.0, 15.2.0) potentially has a bug that triggers some of our tests.

Is the bug reported somewhere? If not, can you do that?

@pitrou

Copy link
Copy Markdown
Member

We possibly have tzdb download set up in CI too and should update it appropriately.

Yes, I think we should do so. There are also a bunch of code snippets in the C++ and Python codebase that could be removed, IIRC.

@rok

rok commented Jan 5, 2026

Copy link
Copy Markdown
MemberAuthor

Is the bug reported somewhere? If not, can you do that?

It seems to be related to a known issue, I added comment explaining our case.

@github-actionsgithub-actionsBot added awaiting changes Awaiting changes awaiting change review Awaiting change review and removed awaiting committer review Awaiting committer review awaiting changes Awaiting changes labels Jan 5, 2026
Comment threadcpp/src/arrow/util/chrono_internal.h Outdated
@github-actionsgithub-actionsBot added awaiting changes Awaiting changes and removed awaiting change review Awaiting change review labels Jan 5, 2026
@rok

rok commented Feb 27, 2026

Copy link
Copy Markdown
MemberAuthor

@github-actions crossbow submit test-r-macos-as-cran

@github-actions

Copy link
Copy Markdown

Revision: 4c5e112

Submitted crossbow builds: ursacomputing/crossbow @ actions-cb3021940b

TaskStatus
test-r-macos-as-cranGitHub Actions

@rok

rok commented Feb 27, 2026

Copy link
Copy Markdown
MemberAuthor

@github-actions crossbow submit test-r-macos-as-cran

@github-actions

Copy link
Copy Markdown

Revision: 9e87d57

Submitted crossbow builds: ursacomputing/crossbow @ actions-a1f6d9bce5

TaskStatus
test-r-macos-as-cranGitHub Actions

@rok

rok commented Feb 27, 2026

Copy link
Copy Markdown
MemberAuthor

I've tried a couple of eebases rebasing on commit before e37c516 succeeded. Trying rebase on 59e0ba6 now. I hope there's not too much to workaround.

@rok

rok commented Feb 27, 2026

Copy link
Copy Markdown
MemberAuthor

@github-actions crossbow submit test-r-macos-as-cran

@github-actions

Copy link
Copy Markdown

Revision: c6caa3c

Submitted crossbow builds: ursacomputing/crossbow @ actions-10e324e6df

TaskStatus
test-r-macos-as-cranGitHub Actions

@rok

rok commented Feb 28, 2026

Copy link
Copy Markdown
MemberAuthor

@jonkeane I rebased to the commit before #49298 and cherrypicked #49223 commit. CRAN CI is now passing. So this PR by itself is above board for CRAN I suppose?

@rok

rok commented Feb 28, 2026

Copy link
Copy Markdown
MemberAuthor

@pitrou since this won't cause issues with CRAN shall we proceed with review?

@rok

rok commented Mar 2, 2026

Copy link
Copy Markdown
MemberAuthor

@github-actions crossbow submit test-r-macos-as-cran

@github-actions

Copy link
Copy Markdown

Revision: a6660df

Submitted crossbow builds: ursacomputing/crossbow @ actions-608e1ed947

TaskStatus
test-r-macos-as-cranGitHub Actions

@rok

rok commented Mar 2, 2026

Copy link
Copy Markdown
MemberAuthor

@github-actions crossbow submit test-r-macos-as-cran

@github-actions

Copy link
Copy Markdown

Revision: aa7aaaf

Submitted crossbow builds: ursacomputing/crossbow @ actions-3ff0f4aa7e

TaskStatus
test-r-macos-as-cranGitHub Actions

@rok

rok commented Mar 2, 2026

Copy link
Copy Markdown
MemberAuthor

@github-actions crossbow submit -g cpp

@github-actions

Copy link
Copy Markdown

Revision: 6ebc076

Submitted crossbow builds: ursacomputing/crossbow @ actions-a0333069ef

TaskStatus
example-cpp-minimal-build-staticGitHub Actions
example-cpp-minimal-build-static-system-dependencyGitHub Actions
example-cpp-tutorialGitHub Actions
test-build-cpp-fuzzGitHub Actions
test-conda-cppGitHub Actions
test-conda-cpp-valgrindGitHub Actions
test-debian-13-cpp-amd64GitHub Actions
test-debian-13-cpp-i386GitHub Actions
test-debian-experimental-cpp-gcc-15GitHub Actions
test-fedora-42-cppGitHub Actions
test-ubuntu-22.04-cppGitHub Actions
test-ubuntu-22.04-cpp-20GitHub Actions
test-ubuntu-22.04-cpp-bundledGitHub Actions
test-ubuntu-22.04-cpp-emscriptenGitHub Actions
test-ubuntu-22.04-cpp-no-threadingGitHub Actions
test-ubuntu-24.04-cppGitHub Actions
test-ubuntu-24.04-cpp-bundled-offlineGitHub Actions
test-ubuntu-24.04-cpp-gcc-13-bundledGitHub Actions
test-ubuntu-24.04-cpp-gcc-14GitHub Actions
test-ubuntu-24.04-cpp-minimal-with-formatsGitHub Actions
test-ubuntu-24.04-cpp-thread-sanitizerGitHub Actions

@rok

rok commented Mar 2, 2026

Copy link
Copy Markdown
MemberAuthor

@github-actions crossbow submit test-r-macos-as-cran

@github-actions

Copy link
Copy Markdown

Revision: 6ebc076

Submitted crossbow builds: ursacomputing/crossbow @ actions-8f1eea3959

TaskStatus
test-r-macos-as-cranGitHub Actions

@rok

rok commented Mar 2, 2026

Copy link
Copy Markdown
MemberAuthor

After rebasing on @jonkeane's #49405 this now seems to pass the CRAN CI.
@pitrou do you think we should get this in for the release?

@rok

rok commented Mar 2, 2026

Copy link
Copy Markdown
MemberAuthor

cc @raulcd

@pitrou

Copy link
Copy Markdown
Member

@rok This PR is fine to me, @raulcd will be the approver here :)

@raulcd

Copy link
Copy Markdown
Member

@github-actions crossbow submit wheel-cp313

@github-actions

Copy link
Copy Markdown

Revision: 6ebc076

Submitted crossbow builds: ursacomputing/crossbow @ actions-7e859b5810

TaskStatus
wheel-macos-monterey-cp313-cp313-amd64GitHub Actions
wheel-macos-monterey-cp313-cp313-arm64GitHub Actions
wheel-macos-monterey-cp313-cp313t-amd64GitHub Actions
wheel-macos-monterey-cp313-cp313t-arm64GitHub Actions
wheel-manylinux-2-28-cp313-cp313-amd64GitHub Actions
wheel-manylinux-2-28-cp313-cp313-arm64GitHub Actions
wheel-manylinux-2-28-cp313-cp313t-amd64GitHub Actions
wheel-manylinux-2-28-cp313-cp313t-arm64GitHub Actions
wheel-musllinux-1-2-cp313-cp313-amd64GitHub Actions
wheel-musllinux-1-2-cp313-cp313-arm64GitHub Actions
wheel-musllinux-1-2-cp313-cp313t-amd64GitHub Actions
wheel-musllinux-1-2-cp313-cp313t-arm64GitHub Actions
wheel-windows-cp313-cp313-amd64GitHub Actions
wheel-windows-cp313-cp313t-amd64GitHub Actions

@raulcdraulcd left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This looks like a great improvement! Thanks @rok !

@rok

rok commented Mar 3, 2026

Copy link
Copy Markdown
MemberAuthor

Thanks for reviews all! I'll keep an eye on the follow-up issue #48743. Feel free to open more if needed.

@conbench-apache-arrow

Copy link
Copy Markdown

After merging your PR, Conbench analyzed the 3 benchmarking runs that have been run so far on merge-commit c48e81e.

There were no benchmark performance regressions. 🎉

The full Conbench report has more details. It also includes information about 7 possible false positives for unstable benchmarks that are known to sometimes produce them.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

8 participants

@rok@pitrou@kou@jonkeane@h-vetinari@raulcd@jorisvandenbossche@thisisnic