Skip to content

Commit 9727ed2

Browse files
authored
Print ZonedDateTimes (#87)
This fixes an issue where `ZonedDateTime`s were displayed as `{unknown value}`. - Add support for printing `ZonedDateTime` as both named timezone and numeric offset. - Update mgclient dependency to v1..5.0. - Ensure tests are run in UTC (to avoid flakiness if tests are invoked in other timezones.)
1 parent 829d46d commit 9727ed2

6 files changed

Lines changed: 94 additions & 1 deletion

File tree

src/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ add_dependencies(${GFLAGS_LIBRARY} gflags-proj)
8585
ExternalProject_Add(mgclient-proj
8686
PREFIX mgclient
8787
GIT_REPOSITORY https://github.com/memgraph/mgclient.git
88-
GIT_TAG v1.4.4
88+
GIT_TAG v1.5.0
8989
CMAKE_ARGS "-DCMAKE_INSTALL_PREFIX=<INSTALL_DIR>"
9090
"-DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER}"
9191
"-DCMAKE_C_COMPILER=${CMAKE_C_COMPILER}"

src/utils/utils.cpp

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
#include <cstdint>
2323
#include <ios>
2424
#include <iostream>
25+
#include <iomanip>
2526
#include <ostream>
2627
#include <string>
2728
#include <string_view>
@@ -290,6 +291,35 @@ void PrintValue(std::ostream &os, const mg_local_date_time *local_date_time) {
290291
PrintValue(os, time);
291292
}
292293

294+
void PrintDateTimeComponents(std::ostream &os, int64_t seconds, int64_t nanoseconds) {
295+
namespace chrono = std::chrono;
296+
auto const secs = chrono::seconds(seconds);
297+
auto const days = chrono::duration_cast<date::days>(secs);
298+
auto const date = mg_date_make(days.count());
299+
300+
auto const nanos =
301+
chrono::duration_cast<chrono::nanoseconds>(secs) - chrono::duration_cast<chrono::nanoseconds>(days);
302+
auto const time = mg_local_time_make(nanos.count() + nanoseconds);
303+
304+
PrintValue(os, date);
305+
os << " ";
306+
PrintValue(os, time);
307+
}
308+
309+
void PrintValue(std::ostream &os, const mg_date_time *date_time) {
310+
PrintDateTimeComponents(os, mg_date_time_seconds(date_time), mg_date_time_nanoseconds(date_time));
311+
auto const minutes = mg_date_time_tz_offset_minutes(date_time);
312+
os << (minutes >= 0 ? '+' : '-') << std::setfill('0') << std::setw(2) << (std::abs(minutes) / 60) << ":"
313+
<< std::setfill('0') << std::setw(2) << (std::abs(minutes) % 60);
314+
}
315+
316+
void PrintValue(std::ostream &os, const mg_date_time_zone_id *date_time_zone_id) {
317+
PrintDateTimeComponents(os, mg_date_time_zone_id_seconds(date_time_zone_id), mg_date_time_zone_id_nanoseconds(date_time_zone_id));
318+
os << "[";
319+
PrintStringUnescaped(os, mg_date_time_zone_id_timezone_name(date_time_zone_id));
320+
os << "]";
321+
}
322+
293323
void PrintSeconds(std::ostream &os, std::chrono::seconds ss, std::chrono::microseconds mis) {
294324
if (ss.count() == 0 && mis.count() < 0) {
295325
os << '-';
@@ -403,6 +433,12 @@ void PrintValue(std::ostream &os, const mg_value *value) {
403433
case MG_VALUE_TYPE_POINT_3D:
404434
PrintValue(os, mg_value_point_3d(value));
405435
return;
436+
case MG_VALUE_TYPE_DATE_TIME:
437+
PrintValue(os, mg_value_date_time(value));
438+
return;
439+
case MG_VALUE_TYPE_DATE_TIME_ZONE_ID:
440+
PrintValue(os, mg_value_date_time_zone_id(value));
441+
return;
406442
default:
407443
os << "{unknown value}";
408444
break;

tests/input_output/input/temporal.txt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,3 +7,10 @@ RETURN localdatetime({year: 2000, day: 23, hour: 12, second: 21});
77
RETURN duration({day: 23, hour: 100, second: 21});
88
RETURN duration({second: 0, microsecond: -123});
99
RETURN duration("P1DT48H61M79.123S");
10+
RETURN datetime("2024-04-21T14:15:00-07:00[America/Los_Angeles]");
11+
RETURN datetime("2024-04-21T14:15:00+07:30");
12+
RETURN datetime("2024-04-21T14:15:00-05:45");
13+
RETURN datetime("2021-04-21T14:15:00Z");
14+
RETURN datetime({year: 2024, month: 4, day: 21, hour: 14, minute: 15, timezone: "America/Los_Angeles"});
15+
RETURN datetime({year: 2021, month: 4, day: 21, hour: 14, minute: 15, timezone: -60});
16+
RETURN datetime({year: 2021, month: 4, day: 21, hour: 14, minute: 15, timezone: 90});

tests/input_output/output_csv/temporal.txt

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,3 +16,17 @@
1616
"P-0.000123S"
1717
"duration(""P1DT48H61M79.123S"")"
1818
"P3DT1H2M19.123000S"
19+
"datetime(""2024-04-21T14:15:00-07:00[America/Los_Angeles]"")"
20+
"2024-04-21 14:15:00.000000000[America/Los_Angeles]"
21+
"datetime(""2024-04-21T14:15:00+07:30"")"
22+
"2024-04-21 14:15:00.000000000+07:30"
23+
"datetime(""2024-04-21T14:15:00-05:45"")"
24+
"2024-04-21 14:15:00.000000000-05:45"
25+
"datetime(""2021-04-21T14:15:00Z"")"
26+
"2021-04-21 14:15:00.000000000[Etc/UTC]"
27+
"datetime({year: 2024, month: 4, day: 21, hour: 14, minute: 15, timezone: ""America/Los_Angeles""})"
28+
"2024-04-21 14:15:00.000000000[America/Los_Angeles]"
29+
"datetime({year: 2021, month: 4, day: 21, hour: 14, minute: 15, timezone: -60})"
30+
"2021-04-21 14:15:00.000000000-01:00"
31+
"datetime({year: 2021, month: 4, day: 21, hour: 14, minute: 15, timezone: 90})"
32+
"2021-04-21 14:15:00.000000000+01:30"

tests/input_output/output_tabular/temporal.txt

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,3 +43,38 @@
4343
+-------------------------------+
4444
| P3DT1H2M19.123000S |
4545
+-------------------------------+
46+
+------------------------------------------------------------+
47+
| datetime("2024-04-21T14:15:00-07:00[America/Los_Angeles]") |
48+
+------------------------------------------------------------+
49+
| 2024-04-21 14:15:00.000000000[America/Los_Angeles] |
50+
+------------------------------------------------------------+
51+
+---------------------------------------+
52+
| datetime("2024-04-21T14:15:00+07:30") |
53+
+---------------------------------------+
54+
| 2024-04-21 14:15:00.000000000+07:30 |
55+
+---------------------------------------+
56+
+---------------------------------------+
57+
| datetime("2024-04-21T14:15:00-05:45") |
58+
+---------------------------------------+
59+
| 2024-04-21 14:15:00.000000000-05:45 |
60+
+---------------------------------------+
61+
+----------------------------------------+
62+
| datetime("2021-04-21T14:15:00Z") |
63+
+----------------------------------------+
64+
| 2021-04-21 14:15:00.000000000[Etc/UTC] |
65+
+----------------------------------------+
66+
+--------------------------------------------------------------------------------------------------+
67+
| datetime({year: 2024, month: 4, day: 21, hour: 14, minute: 15, timezone: "America/Los_Angeles"}) |
68+
+--------------------------------------------------------------------------------------------------+
69+
| 2024-04-21 14:15:00.000000000[America/Los_Angeles] |
70+
+--------------------------------------------------------------------------------------------------+
71+
+--------------------------------------------------------------------------------+
72+
| datetime({year: 2021, month: 4, day: 21, hour: 14, minute: 15, timezone: -60}) |
73+
+--------------------------------------------------------------------------------+
74+
| 2021-04-21 14:15:00.000000000-01:00 |
75+
+--------------------------------------------------------------------------------+
76+
+-------------------------------------------------------------------------------+
77+
| datetime({year: 2021, month: 4, day: 21, hour: 14, minute: 15, timezone: 90}) |
78+
+-------------------------------------------------------------------------------+
79+
| 2021-04-21 14:15:00.000000000+01:30 |
80+
+-------------------------------------------------------------------------------+

tests/input_output/run-tests.sh

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,7 @@ $memgraph_binary --bolt-port 7687 \
9393
--data-recovery-on-startup=false \
9494
--storage-snapshot-on-exit=false \
9595
--telemetry-enabled=false \
96+
--timezone=UTC \
9697
--log-file='' &
9798

9899
pid=$!

0 commit comments

Comments
 (0)