This is an automated email from the ASF dual-hosted git repository.

JingsongLi pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/paimon.git


The following commit(s) were added to refs/heads/master by this push:
     new 46426e8bda [python] Use Native for Java calendar query authorization 
masks (#10545)
46426e8bda is described below

commit 46426e8bda2b1ae72f7cd4d49de2fbcf9a1c9512
Author: Jingsong Lee <[email protected]>
AuthorDate: Tue Oct 13 22:49:18 2026 +0800

    [python] Use Native for Java calendar query authorization masks (#10545)
---
 .../pypaimon/common/predicate_json_parser.py       | 104 +++++++++++---
 .../pypaimon/tests/native_calendar_mask_test.py    | 154 +++++++++++++++++++++
 .../pypaimon/tests/predicate_json_parser_test.py   |  65 +++++++++
 .../tests/resources/calendar_extract_java.jsonl    | 146 +++++++++++++++++++
 4 files changed, 452 insertions(+), 17 deletions(-)

diff --git a/paimon-python/pypaimon/common/predicate_json_parser.py 
b/paimon-python/pypaimon/common/predicate_json_parser.py
index df14ce2097..bfce29d4cc 100644
--- a/paimon-python/pypaimon/common/predicate_json_parser.py
+++ b/paimon-python/pypaimon/common/predicate_json_parser.py
@@ -54,13 +54,8 @@ _TRIM_OPS = {
     "TRAILING": (pc.utf8_rtrim, str.rstrip),
 }
 
-# Calendar-field extractions on a DATE / TIMESTAMP field, mirroring Java's
-# DateExtractTransform subclasses (name -> the Arrow kernel over a timestamp).
-# QUARTER matches (month - 1) / 3 + 1; the day-of-week variants match Java's
-# java.time numbering: WEEKDAY is Monday=0..Sunday=6, ISO_DAY_OF_WEEK is
-# Monday=1..Sunday=7, DAY_OF_WEEK is Sunday=1..Saturday=7. WEEK / YEAR_OF_WEEK
-# are the ISO week-of-week-based-year and the ISO week-based year. The rest map
-# one to one.
+# Java DateExtractTransform names. LTZ is excluded because a calendar field
+# would depend on a session time zone, which authorization rules do not carry.
 _DATE_EXTRACT = {
     "YEAR": pc.year,
     "MONTH": pc.month,
@@ -199,16 +194,93 @@ def _apply_predicate_transform(transform: dict, batch: 
pa.RecordBatch,
 
 
 def _date_extract(name: str, field_ref: dict, batch: pa.RecordBatch) -> 
pa.Array:
-    """Extract a calendar field from a DATE / TIMESTAMP column, as INT.
+    """Java calendar extraction on DATE days or Timestamp milliseconds.
 
-    A DATE is read at the start of its day (Java's LocalDate.atStartOfDay),
-    so it is cast to a timestamp first and HOUR/MINUTE/SECOND come out as 0.
-    Nulls propagate. Mirrors Java DateExtractTransform.
+    Timestamp.toLocalDateTime narrows the epoch day to a signed int. Work on
+    that representation directly, including DATE32 values which cannot be
+    cast to an Arrow microsecond timestamp or a Python datetime.
     """
+    from pypaimon.casting.temporal_utils import _signed
+    stored = field_ref.get('type')
+    if not isinstance(stored, str):
+        raise ValueError("Calendar transform field needs a DATE or TIMESTAMP 
type")
+    # Validate the complete stored SQL spelling before schema-name rebinding.
+    match = 
re.fullmatch(r"\s*(DATE(?=\s|\Z)|TIMESTAMP(?=\s|\(|\Z)(?:\s*\(\s*([0-9]+)\s*\))?"
+                         r"(?:\s*WITHOUT\s+TIME\s+ZONE(?=\s|\Z))?)"
+                         r"(?:\s*(?:NOT\s+)?NULL)?\s*", stored, 
flags=re.IGNORECASE)
+    if match is None or (match.group(2) is not None and int(match.group(2)) > 
9):
+        raise ValueError("Calendar transforms require DATE or TIMESTAMP 
without time zone")
     column = _field_column(field_ref, batch)
-    if pa.types.is_date(column.type):
-        column = pc.cast(column, pa.timestamp("us"))
-    return pc.cast(_DATE_EXTRACT[name](column), pa.int32())
+    date = pa.types.is_date32(column.type)
+    timestamp = pa.types.is_timestamp(column.type) and column.type.tz is None
+    if not date and not timestamp:
+        raise ValueError("Calendar transforms require DATE or TIMESTAMP 
without time zone")
+    raw = column.cast(pa.int32() if date else pa.int64())
+    unit = column.type.unit if timestamp else None
+    # Arrow calendar kernels agree with Java within years 1..9999. Keep their
+    # vectorized execution for ordinary batches; outside this range use Java's
+    # epoch-day arithmetic, avoiding Arrow's bounded calendar representation.
+    bounds = pc.min_max(raw).as_py()
+    ticks_per_day = 1 if date else 86400 * {'s': 1, 'ms': 1000, 'us': 1000000, 
'ns': 1000000000}[unit]
+    if (bounds['min'] is None or
+            (-719162 * ticks_per_day <= bounds['min'] and
+             bounds['max'] < 2932897 * ticks_per_day)):
+        source = column.cast(pa.timestamp('us')) if date else column
+        return _DATE_EXTRACT[name](source).cast(pa.int32())
+    values = raw.to_pylist()
+    results = []
+    for value in values:
+        if value is None:
+            results.append(None)
+            continue
+        if date:
+            day, millis = value, 0
+        else:
+            if unit == 's':
+                millis = _signed(value * 1000, 64)
+            elif unit == 'ms':
+                millis = value
+            else:
+                millis = value // (1000 if unit == 'us' else 1000000)
+            day, millis = _signed(millis // 86400000, 32), millis % 86400000
+        results.append(_calendar_field(name, day, millis))
+    return pa.array(results, type=pa.int32())
+
+
+def _calendar_field(name, day, millis):
+    from pypaimon.casting.temporal_utils import _epoch_day_to_date
+    year, month, date = _epoch_day_to_date(day)
+    weekday = (day + 3) % 7
+    if name == 'YEAR':
+        return year
+    if name == 'MONTH':
+        return month
+    if name == 'DAY':
+        return date
+    if name == 'HOUR':
+        return millis // 3600000
+    if name == 'MINUTE':
+        return millis // 60000 % 60
+    if name == 'SECOND':
+        return millis // 1000 % 60
+    if name == 'QUARTER':
+        return (month - 1) // 3 + 1
+    if name == 'DAY_OF_YEAR':
+        return day - _january_first(year) + 1
+    if name == 'WEEKDAY':
+        return weekday
+    if name == 'ISO_DAY_OF_WEEK':
+        return weekday + 1
+    if name == 'DAY_OF_WEEK':
+        return (weekday + 1) % 7 + 1
+    thursday = day + 3 - weekday
+    week_year = _epoch_day_to_date(thursday)[0]
+    return week_year if name == 'YEAR_OF_WEEK' else (thursday - 
_january_first(week_year)) // 7 + 1
+
+
+def _january_first(year):
+    era, yoe = divmod(year - 1, 400)
+    return era * 146097 + yoe * 365 + yoe // 4 - yoe // 100 + 306 - 719468
 
 
 def _substring(inputs, batch: pa.RecordBatch) -> pa.Array:
@@ -799,9 +871,7 @@ def _collect_all_field_refs_from_transform(transform: dict, 
fields: set = None)
     if fields is None:
         fields = set()
     name = transform.get("name")
-    if name == "FIELD_REF" and "fieldRef" in transform:
-        fields.add(transform["fieldRef"]["name"])
-    elif name == "CAST" and "fieldRef" in transform:
+    if (name in ("FIELD_REF", "CAST") or name in _DATE_EXTRACT) and "fieldRef" 
in transform:
         fields.add(transform["fieldRef"]["name"])
     else:
         for inp in transform.get("inputs", []):
diff --git a/paimon-python/pypaimon/tests/native_calendar_mask_test.py 
b/paimon-python/pypaimon/tests/native_calendar_mask_test.py
new file mode 100644
index 0000000000..e1d2cd6ceb
--- /dev/null
+++ b/paimon-python/pypaimon/tests/native_calendar_mask_test.py
@@ -0,0 +1,154 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+
+"""Existing calendar authorization masks through Native and Python readers."""
+
+import json
+from unittest.mock import patch
+
+import pyarrow as pa
+import pytest
+
+from pypaimon import Schema
+from pypaimon.api.api_response import AuthTableQueryResponse
+from pypaimon.common.predicate_builder import PredicateBuilder
+from pypaimon.read.native_plan import native_runtime_available
+from pypaimon.read.split_serializer import deserialize_split_v1, 
serialize_split_v1
+from pypaimon.schema.schema_change import SchemaChange
+from pypaimon.tests import native_query_auth_test
+
+rest_catalog = native_query_auth_test.rest_catalog
+_read = native_query_auth_test._read
+
+pytestmark = [pytest.mark.native_plan, pytest.mark.skipif(
+    not native_runtime_available(), reason='Rust reader required')]
+_PARTS = ['YEAR', 'MONTH', 'DAY', 'HOUR', 'MINUTE', 'SECOND', 'QUARTER', 
'DAY_OF_YEAR',
+          'WEEKDAY', 'ISO_DAY_OF_WEEK', 'DAY_OF_WEEK', 'WEEK', 'YEAR_OF_WEEK']
+
+
[email protected](params=[
+    ('append', {}), ('primary-key', {'bucket': '1'}),
+    ('data-evolution', {'row-tracking.enabled': 'true', 
'data-evolution.enabled': 'true'}),
+], ids=lambda mode: mode[0])
+def calendar_table(rest_catalog, request):
+    catalog, server = rest_catalog
+    mode, options = request.param
+    schema = pa.schema([('id', pa.int32()), ('n', pa.int32()), ('d', 
pa.date32()),
+                        ('ts', pa.timestamp('ms')), ('us', 
pa.timestamp('us')), ('ns', pa.timestamp('ns'))])
+    catalog.create_table('default.calendar', Schema.from_pyarrow_schema(
+        schema, primary_keys=['id'] if mode == 'primary-key' else None, 
options=options), False)
+    table = catalog.get_table('default.calendar')
+    builder = table.new_batch_write_builder()
+    writer, commit = builder.new_write(), builder.new_commit()
+    try:
+        # Leap day, ISO year boundary, pre-epoch fractional second, NULL.
+        days = [19782, 20087, -1, None]
+        millis = [1709251199123, 1735516800000, -1, None]
+        writer.write_arrow(pa.table({
+            'id': [1, 2, 3, 4], 'n': [0] * 4, 'd': days, 'ts': millis,
+            'us': [value * 1000 + 456 if value is not None else None for value 
in millis],
+            'ns': [value * 1000000 + 456789 if value is not None else None for 
value in millis],
+        }, schema=schema))
+        commit.commit(writer.prepare_commit())
+    finally:
+        writer.close()
+        commit.close()
+    catalog.alter_table(table.identifier, 
[SchemaChange.set_option('query-auth.enabled', 'true')])
+    return catalog.get_table('default.calendar'), server
+
+
+def _rule(part, field, type_):
+    return json.dumps({'name': part, 'fieldRef': {'name': field, 'index': 99, 
'type': type_}})
+
+
[email protected]('field,type_', [('d', 'DATE'), ('ts', 'TIMESTAMP(3)'),
+                                         ('us', 'TIMESTAMP(6)'), ('ns', 
'TIMESTAMP(9)')])
+def test_all_calendar_masks_read_hidden_operands_natively(calendar_table, 
field, type_):
+    table, server = calendar_table
+    # Expected Java values for DATE midnight and TIMESTAMP's wall clock.
+    expected = [
+        [2024, 2024, 1969, None], [2, 12, 12, None], [29, 30, 31, None],
+        [0, 0, 0, None], [0, 0, 0, None], [0, 0, 0, None], [1, 4, 4, None],
+        [60, 365, 365, None], [3, 0, 2, None], [4, 1, 3, None], [5, 2, 4, 
None],
+        [9, 1, 1, None], [2024, 2025, 1970, None],
+    ]
+    if field != 'd':
+        expected[3:6] = [[23, 0, 23, None], [59, 0, 59, None], [59, 0, 59, 
None]]
+    for part, values in zip(_PARTS, expected):
+        server.table_query_auth_store[table.identifier.get_full_name()] = 
AuthTableQueryResponse(
+            column_masking={'n': _rule(part, field, type_)})
+        for native in [False, True]:
+            result = _read(table, native, ['id', 'n']).sort_by([('id', 
'ascending')])
+            assert result.column('n').type == pa.int32()
+            assert result.column('n').to_pylist() == values, (part, field, 
native)
+
+
[email protected]('mode', ['wire', 'setup-failure', 'disable-native'])
+def 
test_calendar_fallback_keeps_hidden_dependency_and_captured_rule(calendar_table,
 mode):
+    table, server = calendar_table
+    server.table_query_auth_store[table.identifier.get_full_name()] = 
AuthTableQueryResponse(
+        column_masking={'n': _rule('YEAR_OF_WEEK', 'd', 'DATE')})
+    table = table.copy({'read.native.enabled': 'true', 
'scan.native-plan.enabled': 'true'})
+    builder = (table.new_read_builder().with_projection(['id']).with_limit(1)
+               .with_filter(PredicateBuilder(table.fields).equal('n', 2025)))
+    scan = builder.new_scan()
+    with patch.object(scan.file_scanner, 'scan', 
side_effect=AssertionError('Native plan fell back')):
+        splits = scan.plan().splits()
+    server.table_query_auth_store[table.identifier.get_full_name()] = 
AuthTableQueryResponse()
+    if mode == 'wire':
+        splits = [deserialize_split_v1(serialize_split_v1(split), []) for 
split in splits]
+    if mode == 'disable-native':
+        builder = (table.copy({'read.native.enabled': 
'false'}).new_read_builder().with_projection(['id'])
+                   .with_filter(PredicateBuilder(table.fields).equal('n', 
2025)).with_limit(1))
+    if mode == 'setup-failure':
+        with patch('pypaimon.read.native_plan.native_read', 
side_effect=RuntimeError('setup failed')):
+            rows = builder.new_read().to_arrow(splits).to_pylist()
+    else:
+        rows = builder.new_read().to_arrow(splits).to_pylist()
+    assert rows == [{'id': 2}]
+
+
[email protected]('native', [False, True])
+def test_calendar_mask_cannot_expose_another_masked_operand(calendar_table, 
native):
+    table, server = calendar_table
+    server.table_query_auth_store[table.identifier.get_full_name()] = 
AuthTableQueryResponse(
+        column_masking={'n': _rule('YEAR', 'd', 'DATE'), 'd': 
json.dumps({'name': 'NULL'})})
+    table = table.copy({'scan.native-plan.enabled': str(native).lower()})
+    with pytest.raises(ValueError, match="masked too"):
+        table.new_read_builder().with_projection(['n']).new_scan().plan()
+
+
[email protected]('native', [False, True])
+def test_stale_calendar_operand_fails_closed(calendar_table, native):
+    table, server = calendar_table
+    server.table_query_auth_store[table.identifier.get_full_name()] = 
AuthTableQueryResponse(
+        column_masking={'n': _rule('YEAR', 'missing', 'DATE')})
+    table = table.copy({'scan.native-plan.enabled': str(native).lower()})
+    with pytest.raises(ValueError, match="missing"):
+        table.new_read_builder().with_projection(['n']).new_scan().plan()
+
+
[email protected]('field,type_', [('d', 'TIMESTAMP(6)'), ('ts', 
'DATE')])
+def test_calendar_mask_rebinds_stored_temporal_family(calendar_table, field, 
type_):
+    table, server = calendar_table
+    # Java validates the stored temporal family, then copies the FieldRef from
+    # the current schema. The actual column decides the executed calendar 
value.
+    server.table_query_auth_store[table.identifier.get_full_name()] = 
AuthTableQueryResponse(
+        column_masking={'n': _rule('YEAR_OF_WEEK', field, type_)})
+    for native in [False, True]:
+        result = _read(table, native, ['n', 'id']).sort_by([('id', 
'ascending')])
+        assert result.column('n').to_pylist() == [2024, 2025, 1970, None]
diff --git a/paimon-python/pypaimon/tests/predicate_json_parser_test.py 
b/paimon-python/pypaimon/tests/predicate_json_parser_test.py
index 7008a40e4d..06cae7efa8 100644
--- a/paimon-python/pypaimon/tests/predicate_json_parser_test.py
+++ b/paimon-python/pypaimon/tests/predicate_json_parser_test.py
@@ -19,6 +19,7 @@
 import datetime
 import json
 import unittest
+from pathlib import Path
 
 import pyarrow as pa
 
@@ -861,6 +862,70 @@ class TestDateExtractTransforms(unittest.TestCase):
         self.assertEqual(self._apply("MONTH", batch, "d", "DATE"), [1, None])
         self.assertEqual(self._apply("HOUR", batch, "d", "DATE"), [0, None])
 
+    def test_calendar_parts_match_java_golden_for_every_storage_unit(self):
+        parts = ['YEAR', 'MONTH', 'DAY', 'HOUR', 'MINUTE', 'SECOND', 
'QUARTER', 'DAY_OF_YEAR',
+                 'WEEKDAY', 'ISO_DAY_OF_WEEK', 'DAY_OF_WEEK', 'WEEK', 
'YEAR_OF_WEEK']
+        golden = Path(__file__).parent / 'resources' / 
'calendar_extract_java.jsonl'
+        for line in golden.read_text().splitlines():
+            case = json.loads(line)
+            unit = case['unit']
+            type_ = pa.date32() if unit == 'date' else pa.timestamp(unit)
+            wire = 'DATE' if unit == 'date' else 'TIMESTAMP(9)'
+            batch = pa.RecordBatch.from_pydict({'t': pa.array([case['value'], 
None], type=type_)})
+            for part, expected in zip(parts, case['parts']):
+                with self.subTest(unit=unit, value=case['value'], part=part):
+                    self.assertEqual(self._apply(part, batch, 't', wire), 
[expected, None])
+
+    def test_empty_and_all_null_calendar_batches(self):
+        for unit in ['date', 's', 'ms', 'us', 'ns']:
+            type_ = pa.date32() if unit == 'date' else pa.timestamp(unit)
+            wire = 'DATE' if unit == 'date' else 'TIMESTAMP(9)'
+            for values in [[], [None, None]]:
+                batch = pa.RecordBatch.from_pydict({'t': pa.array(values, 
type=type_)})
+                for part in ['YEAR', 'MONTH', 'DAY', 'HOUR', 'MINUTE', 
'SECOND', 'QUARTER', 'DAY_OF_YEAR',
+                             'WEEKDAY', 'ISO_DAY_OF_WEEK', 'DAY_OF_WEEK', 
'WEEK', 'YEAR_OF_WEEK']:
+                    with self.subTest(unit=unit, values=values, part=part):
+                        self.assertEqual(self._apply(part, batch, 't', wire), 
values)
+
+    def test_calendar_operand_is_a_dependency_even_if_hidden(self):
+        for part in ['YEAR', 'MONTH', 'DAY', 'HOUR', 'MINUTE', 'SECOND', 
'QUARTER', 'DAY_OF_YEAR',
+                     'WEEKDAY', 'ISO_DAY_OF_WEEK', 'DAY_OF_WEEK', 'WEEK', 
'YEAR_OF_WEEK']:
+            rule = {'name': part, 'fieldRef': {'name': 'hidden', 'index': 99, 
'type': 'DATE'}}
+            predicate = {'kind': 'LEAF', 'function': 'IS_NULL', 'transform': 
rule}
+            self.assertEqual(extract_referenced_fields(json.dumps(predicate)), 
{'hidden'})
+
+    def test_stored_and_rebound_calendar_types_are_validated(self):
+        for stored in ['INT', 'BIGINT', 'TIME(3)', 'TIMESTAMP_LTZ(3)', 
'TIMESTAMP(10)', 'DATENULL',
+                       'TIMESTAMP(٣)', 'TIMESTAMP(3)',
+                       'TIMESTAMP(3) WITHOUT TIME ZONENULL',
+                       'TIMESTAMP(3) WITHOUT TIME ZONENOT NULL',
+                       {'type': 'DATE'}, {'type': 'TIMESTAMP(6)'}, None]:
+            with self.subTest(stored=stored), self.assertRaises(ValueError):
+                self._apply('YEAR', self._ts_batch(), 't', stored)
+        for type_, value in [(pa.int32(), 1), (pa.time32('ms'), 1), 
(pa.timestamp('ms', tz='UTC'), 1)]:
+            batch = pa.RecordBatch.from_pydict({'t': pa.array([value], 
type=type_)})
+            with self.subTest(type=type_), self.assertRaises(ValueError):
+                self._apply('YEAR', batch, 't', 'DATE')
+        # As in Java copyWithNewInputs, DATE and local TIMESTAMP may rebind to
+        # one another; the actual column decides the executed calendar value.
+        for stored in ['DATE', 'DATE NULL', 'TIMESTAMP(3)NOT NULL', 'TIMESTAMP 
WITHOUT TIME ZONE',
+                       'TIMESTAMP(3) WITHOUT TIME ZONE',
+                       'TIMESTAMP(3)WITHOUT TIME ZONE']:
+            with self.subTest(stored=stored):
+                self.assertEqual(self._apply('YEAR', self._ts_batch(), 't', 
stored), [2024, 2024, None])
+
+    def test_full_date32_domain_does_not_require_a_timestamp_cast(self):
+        batch = pa.RecordBatch.from_pydict({"d": pa.array([2147483647, 
-2147483648, None], type=pa.date32())})
+        self.assertEqual(self._apply("HOUR", batch, "d", "DATE"), [0, 0, None])
+
+    def 
test_timestamp_epoch_day_narrows_as_java_int_before_calendar_extraction(self):
+        # Java Timestamp narrows its millisecond epoch day to a signed int.
+        ticks = (2147483648 * 86400000)
+        batch = pa.RecordBatch.from_pydict({"t": pa.array([ticks, -1, None], 
type=pa.timestamp("ms"))})
+        days = pa.RecordBatch.from_pydict({"d": pa.array([-2147483648, -1, 
None], type=pa.date32())})
+        self.assertEqual(self._apply("YEAR", batch, "t", "TIMESTAMP(3)"),
+                         self._apply("YEAR", days, "d", "DATE"))
+
     def test_wired_through_a_leaf_filter(self):
         pred = json.dumps({
             "kind": "LEAF",
diff --git a/paimon-python/pypaimon/tests/resources/calendar_extract_java.jsonl 
b/paimon-python/pypaimon/tests/resources/calendar_extract_java.jsonl
new file mode 100644
index 0000000000..101de934cf
--- /dev/null
+++ b/paimon-python/pypaimon/tests/resources/calendar_extract_java.jsonl
@@ -0,0 +1,146 @@
+{"unit":"date","value":0,"calendar":"1970-01-01","parts":[1970,1,1,0,0,0,1,1,3,4,5,1,1970]}
+{"unit":"date","value":-1,"calendar":"1969-12-31","parts":[1969,12,31,0,0,0,4,365,2,3,4,1,1970]}
+{"unit":"date","value":-719528,"calendar":"0000-01-01","parts":[0,1,1,0,0,0,1,1,5,6,7,52,-1]}
+{"unit":"date","value":-719529,"calendar":"-0001-12-31","parts":[-1,12,31,0,0,0,4,365,4,5,6,52,-1]}
+{"unit":"date","value":-719469,"calendar":"0000-02-29","parts":[0,2,29,0,0,0,1,60,1,2,3,9,0]}
+{"unit":"date","value":-719103,"calendar":"0001-03-01","parts":[1,3,1,0,0,0,1,60,3,4,5,9,1]}
+{"unit":"date","value":-2147483648,"calendar":"-5877641-06-23","parts":[-5877641,6,23,0,0,0,2,174,1,2,3,26,-5877641]}
+{"unit":"date","value":-2147483647,"calendar":"-5877641-06-24","parts":[-5877641,6,24,0,0,0,2,175,2,3,4,26,-5877641]}
+{"unit":"date","value":2147483646,"calendar":"+5881580-07-10","parts":[5881580,7,10,0,0,0,3,192,3,4,5,28,5881580]}
+{"unit":"date","value":2147483647,"calendar":"+5881580-07-11","parts":[5881580,7,11,0,0,0,3,193,4,5,6,28,5881580]}
+{"unit":"date","value":-25509,"calendar":"1900-02-28","parts":[1900,2,28,0,0,0,1,59,2,3,4,9,1900]}
+{"unit":"date","value":-25508,"calendar":"1900-03-01","parts":[1900,3,1,0,0,0,1,60,3,4,5,9,1900]}
+{"unit":"date","value":11015,"calendar":"2000-02-28","parts":[2000,2,28,0,0,0,1,59,0,1,2,9,2000]}
+{"unit":"date","value":11016,"calendar":"2000-02-29","parts":[2000,2,29,0,0,0,1,60,1,2,3,9,2000]}
+{"unit":"date","value":11017,"calendar":"2000-03-01","parts":[2000,3,1,0,0,0,1,61,2,3,4,9,2000]}
+{"unit":"date","value":16800,"calendar":"2015-12-31","parts":[2015,12,31,0,0,0,4,365,3,4,5,53,2015]}
+{"unit":"date","value":16801,"calendar":"2016-01-01","parts":[2016,1,1,0,0,0,1,1,4,5,6,53,2015]}
+{"unit":"date","value":16803,"calendar":"2016-01-03","parts":[2016,1,3,0,0,0,1,3,6,7,1,53,2015]}
+{"unit":"date","value":16804,"calendar":"2016-01-04","parts":[2016,1,4,0,0,0,1,4,0,1,2,1,2016]}
+{"unit":"date","value":18259,"calendar":"2019-12-29","parts":[2019,12,29,0,0,0,4,363,6,7,1,52,2019]}
+{"unit":"date","value":18260,"calendar":"2019-12-30","parts":[2019,12,30,0,0,0,4,364,0,1,2,1,2020]}
+{"unit":"date","value":18627,"calendar":"2020-12-31","parts":[2020,12,31,0,0,0,4,366,3,4,5,53,2020]}
+{"unit":"date","value":18628,"calendar":"2021-01-01","parts":[2021,1,1,0,0,0,1,1,4,5,6,53,2020]}
+{"unit":"date","value":18630,"calendar":"2021-01-03","parts":[2021,1,3,0,0,0,1,3,6,7,1,53,2020]}
+{"unit":"date","value":18631,"calendar":"2021-01-04","parts":[2021,1,4,0,0,0,1,4,0,1,2,1,2021]}
+{"unit":"date","value":19782,"calendar":"2024-02-29","parts":[2024,2,29,0,0,0,1,60,3,4,5,9,2024]}
+{"unit":"date","value":20086,"calendar":"2024-12-29","parts":[2024,12,29,0,0,0,4,364,6,7,1,52,2024]}
+{"unit":"date","value":20087,"calendar":"2024-12-30","parts":[2024,12,30,0,0,0,4,365,0,1,2,1,2025]}
+{"unit":"date","value":20089,"calendar":"2025-01-01","parts":[2025,1,1,0,0,0,1,1,2,3,4,1,2025]}
+{"unit":"ms","value":-9223372036854775808,"millis":-9223372036854775808,"nanos":0,"calendar":"+1705471-09-26T16:47:04.192","parts":[1705471,9,26,16,47,4,3,269,1,2,3,39,1705471]}
+{"unit":"ms","value":9223372036854775807,"millis":9223372036854775807,"nanos":0,"calendar":"-1701532-04-06T07:12:55.807","parts":[-1701532,4,6,7,12,55,2,97,4,5,6,14,-1701532]}
+{"unit":"ms","value":-1,"millis":-1,"nanos":0,"calendar":"1969-12-31T23:59:59.999","parts":[1969,12,31,23,59,59,4,365,2,3,4,1,1970]}
+{"unit":"ms","value":0,"millis":0,"nanos":0,"calendar":"1970-01-01T00:00","parts":[1970,1,1,0,0,0,1,1,3,4,5,1,1970]}
+{"unit":"ms","value":1,"millis":1,"nanos":0,"calendar":"1970-01-01T00:00:00.001","parts":[1970,1,1,0,0,0,1,1,3,4,5,1,1970]}
+{"unit":"ms","value":-1001,"millis":-1001,"nanos":0,"calendar":"1969-12-31T23:59:58.999","parts":[1969,12,31,23,59,58,4,365,2,3,4,1,1970]}
+{"unit":"ms","value":-1000,"millis":-1000,"nanos":0,"calendar":"1969-12-31T23:59:59","parts":[1969,12,31,23,59,59,4,365,2,3,4,1,1970]}
+{"unit":"ms","value":-999,"millis":-999,"nanos":0,"calendar":"1969-12-31T23:59:59.001","parts":[1969,12,31,23,59,59,4,365,2,3,4,1,1970]}
+{"unit":"ms","value":999,"millis":999,"nanos":0,"calendar":"1970-01-01T00:00:00.999","parts":[1970,1,1,0,0,0,1,1,3,4,5,1,1970]}
+{"unit":"ms","value":1000,"millis":1000,"nanos":0,"calendar":"1970-01-01T00:00:01","parts":[1970,1,1,0,0,1,1,1,3,4,5,1,1970]}
+{"unit":"ms","value":1001,"millis":1001,"nanos":0,"calendar":"1970-01-01T00:00:01.001","parts":[1970,1,1,0,0,1,1,1,3,4,5,1,1970]}
+{"unit":"ms","value":-86400001,"millis":-86400001,"nanos":0,"calendar":"1969-12-30T23:59:59.999","parts":[1969,12,30,23,59,59,4,364,1,2,3,1,1970]}
+{"unit":"ms","value":-86400000,"millis":-86400000,"nanos":0,"calendar":"1969-12-31T00:00","parts":[1969,12,31,0,0,0,4,365,2,3,4,1,1970]}
+{"unit":"ms","value":-86399999,"millis":-86399999,"nanos":0,"calendar":"1969-12-31T00:00:00.001","parts":[1969,12,31,0,0,0,4,365,2,3,4,1,1970]}
+{"unit":"ms","value":86399999,"millis":86399999,"nanos":0,"calendar":"1970-01-01T23:59:59.999","parts":[1970,1,1,23,59,59,1,1,3,4,5,1,1970]}
+{"unit":"ms","value":86400000,"millis":86400000,"nanos":0,"calendar":"1970-01-02T00:00","parts":[1970,1,2,0,0,0,1,2,4,5,6,1,1970]}
+{"unit":"ms","value":86400001,"millis":86400001,"nanos":0,"calendar":"1970-01-02T00:00:00.001","parts":[1970,1,2,0,0,0,1,2,4,5,6,1,1970]}
+{"unit":"ms","value":-185542587187200000,"millis":-185542587187200000,"nanos":0,"calendar":"-5877641-06-23T00:00","parts":[-5877641,6,23,0,0,0,2,174,1,2,3,26,-5877641]}
+{"unit":"ms","value":-185542587187200001,"millis":-185542587187200001,"nanos":0,"calendar":"+5881580-07-11T23:59:59.999","parts":[5881580,7,11,23,59,59,3,193,4,5,6,28,5881580]}
+{"unit":"ms","value":185542587100800000,"millis":185542587100800000,"nanos":0,"calendar":"+5881580-07-11T00:00","parts":[5881580,7,11,0,0,0,3,193,4,5,6,28,5881580]}
+{"unit":"ms","value":185542587187199999,"millis":185542587187199999,"nanos":0,"calendar":"+5881580-07-11T23:59:59.999","parts":[5881580,7,11,23,59,59,3,193,4,5,6,28,5881580]}
+{"unit":"ms","value":185542587187200000,"millis":185542587187200000,"nanos":0,"calendar":"-5877641-06-23T00:00","parts":[-5877641,6,23,0,0,0,2,174,1,2,3,26,-5877641]}
+{"unit":"ms","value":371085174374400000,"millis":371085174374400000,"nanos":0,"calendar":"1970-01-01T00:00","parts":[1970,1,1,0,0,0,1,1,3,4,5,1,1970]}
+{"unit":"ms","value":-371085174374400000,"millis":-371085174374400000,"nanos":0,"calendar":"1970-01-01T00:00","parts":[1970,1,1,0,0,0,1,1,3,4,5,1,1970]}
+{"unit":"us","value":-9223372036854775808,"millis":-9223372036854776,"nanos":192000,"calendar":"-290308-12-21T19:59:05.224192","parts":[-290308,12,21,19,59,5,4,356,6,7,1,51,-290308]}
+{"unit":"us","value":9223372036854775807,"millis":9223372036854775,"nanos":807000,"calendar":"+294247-01-10T04:00:54.775807","parts":[294247,1,10,4,0,54,1,10,6,7,1,1,294247]}
+{"unit":"us","value":-1,"millis":-1,"nanos":999000,"calendar":"1969-12-31T23:59:59.999999","parts":[1969,12,31,23,59,59,4,365,2,3,4,1,1970]}
+{"unit":"us","value":0,"millis":0,"nanos":0,"calendar":"1970-01-01T00:00","parts":[1970,1,1,0,0,0,1,1,3,4,5,1,1970]}
+{"unit":"us","value":1,"millis":0,"nanos":1000,"calendar":"1970-01-01T00:00:00.000001","parts":[1970,1,1,0,0,0,1,1,3,4,5,1,1970]}
+{"unit":"us","value":-1000001,"millis":-1001,"nanos":999000,"calendar":"1969-12-31T23:59:58.999999","parts":[1969,12,31,23,59,58,4,365,2,3,4,1,1970]}
+{"unit":"us","value":-1000000,"millis":-1000,"nanos":0,"calendar":"1969-12-31T23:59:59","parts":[1969,12,31,23,59,59,4,365,2,3,4,1,1970]}
+{"unit":"us","value":-999999,"millis":-1000,"nanos":1000,"calendar":"1969-12-31T23:59:59.000001","parts":[1969,12,31,23,59,59,4,365,2,3,4,1,1970]}
+{"unit":"us","value":999999,"millis":999,"nanos":999000,"calendar":"1970-01-01T00:00:00.999999","parts":[1970,1,1,0,0,0,1,1,3,4,5,1,1970]}
+{"unit":"us","value":1000000,"millis":1000,"nanos":0,"calendar":"1970-01-01T00:00:01","parts":[1970,1,1,0,0,1,1,1,3,4,5,1,1970]}
+{"unit":"us","value":1000001,"millis":1000,"nanos":1000,"calendar":"1970-01-01T00:00:01.000001","parts":[1970,1,1,0,0,1,1,1,3,4,5,1,1970]}
+{"unit":"us","value":-86400000001,"millis":-86400001,"nanos":999000,"calendar":"1969-12-30T23:59:59.999999","parts":[1969,12,30,23,59,59,4,364,1,2,3,1,1970]}
+{"unit":"us","value":-86400000000,"millis":-86400000,"nanos":0,"calendar":"1969-12-31T00:00","parts":[1969,12,31,0,0,0,4,365,2,3,4,1,1970]}
+{"unit":"us","value":-86399999999,"millis":-86400000,"nanos":1000,"calendar":"1969-12-31T00:00:00.000001","parts":[1969,12,31,0,0,0,4,365,2,3,4,1,1970]}
+{"unit":"us","value":86399999999,"millis":86399999,"nanos":999000,"calendar":"1970-01-01T23:59:59.999999","parts":[1970,1,1,23,59,59,1,1,3,4,5,1,1970]}
+{"unit":"us","value":86400000000,"millis":86400000,"nanos":0,"calendar":"1970-01-02T00:00","parts":[1970,1,2,0,0,0,1,2,4,5,6,1,1970]}
+{"unit":"us","value":86400000001,"millis":86400000,"nanos":1000,"calendar":"1970-01-02T00:00:00.000001","parts":[1970,1,2,0,0,0,1,2,4,5,6,1,1970]}
+{"unit":"ns","value":-9223372036854775808,"millis":-9223372036855,"nanos":224192,"calendar":"1677-09-21T00:12:43.145224192","parts":[1677,9,21,0,12,43,3,264,1,2,3,38,1677]}
+{"unit":"ns","value":9223372036854775807,"millis":9223372036854,"nanos":775807,"calendar":"2262-04-11T23:47:16.854775807","parts":[2262,4,11,23,47,16,2,101,4,5,6,15,2262]}
+{"unit":"ns","value":-1,"millis":-1,"nanos":999999,"calendar":"1969-12-31T23:59:59.999999999","parts":[1969,12,31,23,59,59,4,365,2,3,4,1,1970]}
+{"unit":"ns","value":0,"millis":0,"nanos":0,"calendar":"1970-01-01T00:00","parts":[1970,1,1,0,0,0,1,1,3,4,5,1,1970]}
+{"unit":"ns","value":1,"millis":0,"nanos":1,"calendar":"1970-01-01T00:00:00.000000001","parts":[1970,1,1,0,0,0,1,1,3,4,5,1,1970]}
+{"unit":"ns","value":-1000000001,"millis":-1001,"nanos":999999,"calendar":"1969-12-31T23:59:58.999999999","parts":[1969,12,31,23,59,58,4,365,2,3,4,1,1970]}
+{"unit":"ns","value":-1000000000,"millis":-1000,"nanos":0,"calendar":"1969-12-31T23:59:59","parts":[1969,12,31,23,59,59,4,365,2,3,4,1,1970]}
+{"unit":"ns","value":-999999999,"millis":-1000,"nanos":1,"calendar":"1969-12-31T23:59:59.000000001","parts":[1969,12,31,23,59,59,4,365,2,3,4,1,1970]}
+{"unit":"ns","value":999999999,"millis":999,"nanos":999999,"calendar":"1970-01-01T00:00:00.999999999","parts":[1970,1,1,0,0,0,1,1,3,4,5,1,1970]}
+{"unit":"ns","value":1000000000,"millis":1000,"nanos":0,"calendar":"1970-01-01T00:00:01","parts":[1970,1,1,0,0,1,1,1,3,4,5,1,1970]}
+{"unit":"ns","value":1000000001,"millis":1000,"nanos":1,"calendar":"1970-01-01T00:00:01.000000001","parts":[1970,1,1,0,0,1,1,1,3,4,5,1,1970]}
+{"unit":"ns","value":-86400000000001,"millis":-86400001,"nanos":999999,"calendar":"1969-12-30T23:59:59.999999999","parts":[1969,12,30,23,59,59,4,364,1,2,3,1,1970]}
+{"unit":"ns","value":-86400000000000,"millis":-86400000,"nanos":0,"calendar":"1969-12-31T00:00","parts":[1969,12,31,0,0,0,4,365,2,3,4,1,1970]}
+{"unit":"ns","value":-86399999999999,"millis":-86400000,"nanos":1,"calendar":"1969-12-31T00:00:00.000000001","parts":[1969,12,31,0,0,0,4,365,2,3,4,1,1970]}
+{"unit":"ns","value":86399999999999,"millis":86399999,"nanos":999999,"calendar":"1970-01-01T23:59:59.999999999","parts":[1970,1,1,23,59,59,1,1,3,4,5,1,1970]}
+{"unit":"ns","value":86400000000000,"millis":86400000,"nanos":0,"calendar":"1970-01-02T00:00","parts":[1970,1,2,0,0,0,1,2,4,5,6,1,1970]}
+{"unit":"ns","value":86400000000001,"millis":86400000,"nanos":1,"calendar":"1970-01-02T00:00:00.000000001","parts":[1970,1,2,0,0,0,1,2,4,5,6,1,1970]}
+{"unit":"s","value":-9223372036854775,"millis":-9223372036854775000,"nanos":0,"calendar":"+1705471-09-26T16:47:05","parts":[1705471,9,26,16,47,5,3,269,1,2,3,39,1705471]}
+{"unit":"s","value":9223372036854775,"millis":9223372036854775000,"nanos":0,"calendar":"-1701532-04-06T07:12:55","parts":[-1701532,4,6,7,12,55,2,97,4,5,6,14,-1701532]}
+{"unit":"s","value":-86401,"millis":-86401000,"nanos":0,"calendar":"1969-12-30T23:59:59","parts":[1969,12,30,23,59,59,4,364,1,2,3,1,1970]}
+{"unit":"s","value":-86400,"millis":-86400000,"nanos":0,"calendar":"1969-12-31T00:00","parts":[1969,12,31,0,0,0,4,365,2,3,4,1,1970]}
+{"unit":"s","value":-86399,"millis":-86399000,"nanos":0,"calendar":"1969-12-31T00:00:01","parts":[1969,12,31,0,0,1,4,365,2,3,4,1,1970]}
+{"unit":"s","value":-1,"millis":-1000,"nanos":0,"calendar":"1969-12-31T23:59:59","parts":[1969,12,31,23,59,59,4,365,2,3,4,1,1970]}
+{"unit":"s","value":0,"millis":0,"nanos":0,"calendar":"1970-01-01T00:00","parts":[1970,1,1,0,0,0,1,1,3,4,5,1,1970]}
+{"unit":"s","value":1,"millis":1000,"nanos":0,"calendar":"1970-01-01T00:00:01","parts":[1970,1,1,0,0,1,1,1,3,4,5,1,1970]}
+{"unit":"s","value":86399,"millis":86399000,"nanos":0,"calendar":"1970-01-01T23:59:59","parts":[1970,1,1,23,59,59,1,1,3,4,5,1,1970]}
+{"unit":"s","value":86400,"millis":86400000,"nanos":0,"calendar":"1970-01-02T00:00","parts":[1970,1,2,0,0,0,1,2,4,5,6,1,1970]}
+{"unit":"s","value":86401,"millis":86401000,"nanos":0,"calendar":"1970-01-02T00:00:01","parts":[1970,1,2,0,0,1,1,2,4,5,6,1,1970]}
+{"unit":"date","value":-719163,"calendar":"0000-12-31","parts":[0,12,31,0,0,0,4,366,6,7,1,52,0]}
+{"unit":"date","value":-719163,"calendar":"0000-12-31","parts":[0,12,31,0,0,0,4,366,6,7,1,52,0]}
+{"unit":"date","value":-719162,"calendar":"0001-01-01","parts":[1,1,1,0,0,0,1,1,0,1,2,1,1]}
+{"unit":"date","value":-719161,"calendar":"0001-01-02","parts":[1,1,2,0,0,0,1,2,1,2,3,1,1]}
+{"unit":"date","value":-719162,"calendar":"0001-01-01","parts":[1,1,1,0,0,0,1,1,0,1,2,1,1]}
+{"unit":"date","value":-719161,"calendar":"0001-01-02","parts":[1,1,2,0,0,0,1,2,1,2,3,1,1]}
+{"unit":"date","value":2932896,"calendar":"9999-12-31","parts":[9999,12,31,0,0,0,4,365,4,5,6,52,9999]}
+{"unit":"date","value":2932896,"calendar":"9999-12-31","parts":[9999,12,31,0,0,0,4,365,4,5,6,52,9999]}
+{"unit":"date","value":2932897,"calendar":"+10000-01-01","parts":[10000,1,1,0,0,0,1,1,5,6,7,52,9999]}
+{"unit":"date","value":2932898,"calendar":"+10000-01-02","parts":[10000,1,2,0,0,0,1,2,6,7,1,52,9999]}
+{"unit":"date","value":2932897,"calendar":"+10000-01-01","parts":[10000,1,1,0,0,0,1,1,5,6,7,52,9999]}
+{"unit":"date","value":2932898,"calendar":"+10000-01-02","parts":[10000,1,2,0,0,0,1,2,6,7,1,52,9999]}
+{"unit":"s","value":-62135683200,"millis":-62135683200000,"nanos":0,"calendar":"0000-12-31T00:00","parts":[0,12,31,0,0,0,4,366,6,7,1,52,0]}
+{"unit":"s","value":-62135596801,"millis":-62135596801000,"nanos":0,"calendar":"0000-12-31T23:59:59","parts":[0,12,31,23,59,59,4,366,6,7,1,52,0]}
+{"unit":"s","value":-62135596800,"millis":-62135596800000,"nanos":0,"calendar":"0001-01-01T00:00","parts":[1,1,1,0,0,0,1,1,0,1,2,1,1]}
+{"unit":"s","value":-62135596799,"millis":-62135596799000,"nanos":0,"calendar":"0001-01-01T00:00:01","parts":[1,1,1,0,0,1,1,1,0,1,2,1,1]}
+{"unit":"s","value":-62135510401,"millis":-62135510401000,"nanos":0,"calendar":"0001-01-01T23:59:59","parts":[1,1,1,23,59,59,1,1,0,1,2,1,1]}
+{"unit":"s","value":-62135510400,"millis":-62135510400000,"nanos":0,"calendar":"0001-01-02T00:00","parts":[1,1,2,0,0,0,1,2,1,2,3,1,1]}
+{"unit":"s","value":253402214400,"millis":253402214400000,"nanos":0,"calendar":"9999-12-31T00:00","parts":[9999,12,31,0,0,0,4,365,4,5,6,52,9999]}
+{"unit":"s","value":253402300799,"millis":253402300799000,"nanos":0,"calendar":"9999-12-31T23:59:59","parts":[9999,12,31,23,59,59,4,365,4,5,6,52,9999]}
+{"unit":"s","value":253402300800,"millis":253402300800000,"nanos":0,"calendar":"+10000-01-01T00:00","parts":[10000,1,1,0,0,0,1,1,5,6,7,52,9999]}
+{"unit":"s","value":253402300801,"millis":253402300801000,"nanos":0,"calendar":"+10000-01-01T00:00:01","parts":[10000,1,1,0,0,1,1,1,5,6,7,52,9999]}
+{"unit":"s","value":253402387199,"millis":253402387199000,"nanos":0,"calendar":"+10000-01-01T23:59:59","parts":[10000,1,1,23,59,59,1,1,5,6,7,52,9999]}
+{"unit":"s","value":253402387200,"millis":253402387200000,"nanos":0,"calendar":"+10000-01-02T00:00","parts":[10000,1,2,0,0,0,1,2,6,7,1,52,9999]}
+{"unit":"ms","value":-62135683200000,"millis":-62135683200000,"nanos":0,"calendar":"0000-12-31T00:00","parts":[0,12,31,0,0,0,4,366,6,7,1,52,0]}
+{"unit":"ms","value":-62135596800001,"millis":-62135596800001,"nanos":0,"calendar":"0000-12-31T23:59:59.999","parts":[0,12,31,23,59,59,4,366,6,7,1,52,0]}
+{"unit":"ms","value":-62135596800000,"millis":-62135596800000,"nanos":0,"calendar":"0001-01-01T00:00","parts":[1,1,1,0,0,0,1,1,0,1,2,1,1]}
+{"unit":"ms","value":-62135596799999,"millis":-62135596799999,"nanos":0,"calendar":"0001-01-01T00:00:00.001","parts":[1,1,1,0,0,0,1,1,0,1,2,1,1]}
+{"unit":"ms","value":-62135510400001,"millis":-62135510400001,"nanos":0,"calendar":"0001-01-01T23:59:59.999","parts":[1,1,1,23,59,59,1,1,0,1,2,1,1]}
+{"unit":"ms","value":-62135510400000,"millis":-62135510400000,"nanos":0,"calendar":"0001-01-02T00:00","parts":[1,1,2,0,0,0,1,2,1,2,3,1,1]}
+{"unit":"ms","value":253402214400000,"millis":253402214400000,"nanos":0,"calendar":"9999-12-31T00:00","parts":[9999,12,31,0,0,0,4,365,4,5,6,52,9999]}
+{"unit":"ms","value":253402300799999,"millis":253402300799999,"nanos":0,"calendar":"9999-12-31T23:59:59.999","parts":[9999,12,31,23,59,59,4,365,4,5,6,52,9999]}
+{"unit":"ms","value":253402300800000,"millis":253402300800000,"nanos":0,"calendar":"+10000-01-01T00:00","parts":[10000,1,1,0,0,0,1,1,5,6,7,52,9999]}
+{"unit":"ms","value":253402300800001,"millis":253402300800001,"nanos":0,"calendar":"+10000-01-01T00:00:00.001","parts":[10000,1,1,0,0,0,1,1,5,6,7,52,9999]}
+{"unit":"ms","value":253402387199999,"millis":253402387199999,"nanos":0,"calendar":"+10000-01-01T23:59:59.999","parts":[10000,1,1,23,59,59,1,1,5,6,7,52,9999]}
+{"unit":"ms","value":253402387200000,"millis":253402387200000,"nanos":0,"calendar":"+10000-01-02T00:00","parts":[10000,1,2,0,0,0,1,2,6,7,1,52,9999]}
+{"unit":"us","value":-62135683200000000,"millis":-62135683200000,"nanos":0,"calendar":"0000-12-31T00:00","parts":[0,12,31,0,0,0,4,366,6,7,1,52,0]}
+{"unit":"us","value":-62135596800000001,"millis":-62135596800001,"nanos":999000,"calendar":"0000-12-31T23:59:59.999999","parts":[0,12,31,23,59,59,4,366,6,7,1,52,0]}
+{"unit":"us","value":-62135596800000000,"millis":-62135596800000,"nanos":0,"calendar":"0001-01-01T00:00","parts":[1,1,1,0,0,0,1,1,0,1,2,1,1]}
+{"unit":"us","value":-62135596799999999,"millis":-62135596800000,"nanos":1000,"calendar":"0001-01-01T00:00:00.000001","parts":[1,1,1,0,0,0,1,1,0,1,2,1,1]}
+{"unit":"us","value":-62135510400000001,"millis":-62135510400001,"nanos":999000,"calendar":"0001-01-01T23:59:59.999999","parts":[1,1,1,23,59,59,1,1,0,1,2,1,1]}
+{"unit":"us","value":-62135510400000000,"millis":-62135510400000,"nanos":0,"calendar":"0001-01-02T00:00","parts":[1,1,2,0,0,0,1,2,1,2,3,1,1]}
+{"unit":"us","value":253402214400000000,"millis":253402214400000,"nanos":0,"calendar":"9999-12-31T00:00","parts":[9999,12,31,0,0,0,4,365,4,5,6,52,9999]}
+{"unit":"us","value":253402300799999999,"millis":253402300799999,"nanos":999000,"calendar":"9999-12-31T23:59:59.999999","parts":[9999,12,31,23,59,59,4,365,4,5,6,52,9999]}
+{"unit":"us","value":253402300800000000,"millis":253402300800000,"nanos":0,"calendar":"+10000-01-01T00:00","parts":[10000,1,1,0,0,0,1,1,5,6,7,52,9999]}
+{"unit":"us","value":253402300800000001,"millis":253402300800000,"nanos":1000,"calendar":"+10000-01-01T00:00:00.000001","parts":[10000,1,1,0,0,0,1,1,5,6,7,52,9999]}
+{"unit":"us","value":253402387199999999,"millis":253402387199999,"nanos":999000,"calendar":"+10000-01-01T23:59:59.999999","parts":[10000,1,1,23,59,59,1,1,5,6,7,52,9999]}
+{"unit":"us","value":253402387200000000,"millis":253402387200000,"nanos":0,"calendar":"+10000-01-02T00:00","parts":[10000,1,2,0,0,0,1,2,6,7,1,52,9999]}

Reply via email to