تصفية البيانات

تعتمد Google Health API على عبارات الفلترة لحصر نقاط البيانات التي يتم عرضها عند استدعاء طرق الاسترداد العادية. على وجه التحديد، تُستخدم الفلاتر مع ما يلي:

يوضّح هذا الدليل كيفية تنفيذ الفلترة وبنية الجملة والاصطلاحات، ويتضمّن أمثلة لكل نوع من أنواع السجلات.

اتّفاقيات الفلترة

تطبِّق Google Health API الفلاتر وفقًا لمعيار مقترحات تحسين Google API (AIP-160).

مَعلمات طلب البحث

يتم تمرير الفلاتر باستخدام سلسلة طلب البحث في عنوان URL في المَعلمة filter. بما أنّ الفلاتر تحتوي على رموز خاصة (مثل < و>= وعلامات الاقتباس)، يجب أن تكون بترميز عنوان URL عند إرسالها في طلب HTTP.

على سبيل المثال، يجب ترميز طلب يتضمّن الفلتر steps.interval.civil_start_time >= "2026-03-04T00:00:00" على النحو التالي:

GET https://health.googleapis.com/v4/users/me/dataTypes/steps/dataPoints
  ?filter=steps.interval.civil_start_time%20%3E%3D%20%222026-03-04T00%3A00%3A00%22

تنسيق التسمية

إذا كان نوع البيانات يتضمّن أكثر من كلمة واحدة، يختلف تنسيق المعرّف بين مسار المورد والفلتر على النحو التالي:

  • مسار نقطة النهاية: استخدِم شرطات (على سبيل المثال، /dataTypes/body-fat).
  • سلسلة الفلتر: استخدِموا شُرطًا سفلية (على سبيل المثال، body_fat).

إذا كنت تستخدم شرطات في معرّف الفلتر، ستعرض واجهة برمجة التطبيقات 400 Bad Request مع سبب الخطأ INVALID_DATA_POINT_FILTER.

أنواع الحقول والفلاتر

تعتمد الحقول التي تستخدمها في الفلتر على نوع السجلّ لنوع البيانات الذي تجري عليه طلب بحث. يوضّح الجدول التالي الحقول المتوافقة مع كل نوع من أنواع السجلات:

نوع السجلّ الوصف حقول الفلتر المتوافقة
تمرين متناوب نقاط البيانات المسجّلة على مدار فترة زمنية (على سبيل المثال، steps وdistance وcalories) {dataType}.interval.start_time
{dataType}.interval.civil_start_time

مثال:
steps.interval.civil_start_time
عيّنة الملاحظات الفورية أو القياسات القصيرة (مثل weight وbody-fat وblood-glucose) {dataType}.sample_time.physical_time
{dataType}.sample_time.civil_time

مثال:
body_fat.sample_time.physical_time
يوميًا المقاييس والملخّصات اليومية (مثل daily-heart-rate-variability) {dataType}.date

مثال:
daily_heart_rate_variability.date
الجلسة جلسات المستخدمين الموسّعة مع قواعد توقيت متخصّصة التمرين: {dataType}.interval.civil_start_time
النوم: sleep.interval.end_time، sleep.interval.civil_end_time
تخطيط القلب الكهربائي: electrocardiogram.interval.start_time

مثال:
sleep.interval.civil_end_time

عوامل التشغيل وقواعد التنسيق المتوافقة

يجب أن تتوافق عبارات الفلترة مع قواعد التنسيق التالية:

عوامل تشغيل المقارنة

يمكن استخدام عاملَي مقارنة فقط:

عامل التشغيل الوصف
>= الحد الأدنى (شامل).
< الحدّ الأعلى (غير مشمول).

يؤدي استخدام عوامل مقارنة أخرى (مثل > أو <= أو =) إلى عرض 400 Bad Request مع INVALID_DATA_POINT_FILTER_RESTRICTION_COMPARATOR.

العوامل المنطقية

عامل التشغيل الدعم
AND عامل التشغيل التلقائي والوحيد المتاح. تُستخدَم لدمج حدود البداية والنهاية.
OR غير متوافقة. يؤدي استخدام OR إلى عرض 400 Bad Request مع سبب الخطأ INVALID_DATA_POINT_FILTER_EXPRESSION_STRUCTURE ("يجب أن يكون الفلتر عبارة عن اقتران أو تسلسل للقيود. تم العثور على: DISJUNCTION").

قيم حرفية للوقت

يجب أن تستخدم القيم الحرفية للوقت في عبارات الفلتر التنسيقات التالية:

نوع الوقت المتطلبات أمثلة
الوقت الفعلي تنسيق RFC 3339، وينتهي بـ Z أو معادلة الوقت بالتوقيت العالمي المنسَّق. تمثّل هذه السمة أحداثًا من العالم الواقعي بالتوقيت العالمي المنسّق. الإجابات الصحيحة: "2026-03-01T00:00:00Z"، "2026-03-01T00:00:00-08:00"
الإجابات الخاطئة: "2026-03-01"
التوقيت المدني تنسيق ISO 8601: YYYY-MM-DD[THH:mm:ss] تمثّل هذه السمة الوقت على ساعة المستخدم، بغض النظر عن الموقع الجغرافي أو فروق المناطق الزمنية. صحيح: "2026-03-01"، "2026-03-01T08:30:00"

قواعد التحقّق من صحة الفلاتر

تخضع الفلاتر للقواعد التالية:

القاعدة الوصف أمثلة
ما مِن أنواع أوقات مختلطة لا تخلط بين الحدود الزمنية الفعلية والمدنية. غير صالح: steps.interval.start_time >= "2026-03-01T00:00:00Z" AND steps.interval.civil_start_time < "2026-03-02"
Error: INVALID_DATA_POINT_FILTER_MIXED_TIME_RESTRICTIONS ("لا يمكن أن يحتوي الفلتر على نطاقات زمنية فعلية ومدنية")
عدم استخدام أنواع بيانات مختلطة استخدِم الحقول التي تنتمي إلى نوع البيانات في مسار الطلب. غير صالح: المسار /users/.../dataTypes/steps/... مع الفلتر distance.interval.start_time >= "..."
الخطأ: INVALID_DATA_POINT_FILTER_COLLECTION_MISMATCH ("نوع البيانات في الفلتر لا يتطابق مع مجموعة نوع البيانات الأصلية")
منطق ترتيب الوقت يجب أن يكون الحدّ الأعلى أكبر من الحدّ الأدنى. غير صالح: steps.interval.start_time >= "2026-03-02T00:00:00Z" AND steps.interval.start_time < "2026-03-01T00:00:00Z"
Error: INVALID_TIME_RANGE ("يجب أن يكون وقت انتهاء طلب البحث أكبر من وقت البدء")
تنسيق الحافظة استخدِم حالة snake التي تتطابق مع اسم نوع البيانات. غير صالح: body-fat.sample_time.physical_time >= "..."
خطأ: INVALID_DATA_POINT_FILTER ("الفلتر غير صالح")

تعرض واجهة برمجة التطبيقات رمز HTTP 400 Bad Request للفلاتر غير الصالحة. تحقَّق من error.details[].metadata.detailedReasons لمعرفة رمز سبب الخطأ.

نطاقات OAuth المطلوبة

للاستعلام عن نقاط البيانات باستخدام عوامل التصفية، يجب أن يمنح المستخدم المفوّض نطاق OAuth ذي الصلة لنوع البيانات هذا. في حال عدم توفّر النطاق المطلوب، تعرض واجهة برمجة التطبيقات الحالة 403 Forbidden مع MISSING_OAUTH_SCOPE.

يوضّح الجدول التالي نطاقات OAuth وأنواع البيانات التي تمنح إذن الوصول للقراءة. يعرض الجدول النطاقات بتنسيقها النسبي (على سبيل المثال، .activity_and_fitness.readonly يمثّل https://www.googleapis.com/auth/googlehealth.activity_and_fitness.readonly):

نطاق OAuth المطلوب أنواع البيانات
.activity_and_fitness.readonly active-energy-burned وactive-minutes وactive-zone-minutes وactivity-level وaltitude وcalories-in-heart-rate-zone وdaily-vo2-max وdistance وexercise وfloors وrun-vo2-max وsedentary-period وsteps وswim-lengths-data وtime-in-heart-rate-zone وtotal-calories وvo2-max
.ecg.readonly مخطط كهربية القلب
.health_metrics_and_measurements.readonly blood-glucose, body-fat, core-body-temperature, daily-heart-rate-variability, daily-heart-rate-zones, daily-oxygen-saturation, daily-respiratory-rate, daily-resting-heart-rate, daily-sleep-temperature-derivations, heart-rate, heart-rate-variability, height, oxygen-saturation, respiratory-rate-sleep-summary, skin-temperature-sensors, weight
.irn.readonly irregular-rhythm-notification
.nutrition.readonly طعام، وحدة قياس الطعام، سجلّ شرب الماء والسوائل، سجلّ المعلومات الغذائية
.sleep.readonly النوم

إذا تم منح عميلك نطاق كتابة فقط (مثل .activity_and_fitness.writeonly) لنوع بيانات مطلوب، سيظل بإمكانك طلب البحث عن نقاط البيانات التي كتبها عميلك. في هذه الحالة، يتم حصر الطلبات ضمنيًا على عائلة مصدر البيانات self-sources. للاطّلاع على التفاصيل وقيود أنواع البيانات، يُرجى الانتقال إلى الفلترة حسب مجموعة مصادر البيانات.

حالات الاستخدام والأمثلة

توضّح الأمثلة التالية كيفية إنشاء فلاتر للسيناريوهات الشائعة:

طلب خطوات حسب النطاق الزمني الفعلي

خطوات طلب البحث التي تم تسجيلها بين 2026-03-01T00:00:00Z (شاملة) و2026-03-02T00:00:00Z (غير شاملة):

GET https://health.googleapis.com/v4/users/me/dataTypes/steps/dataPoints
  ?filter=steps.interval.start_time >= "2026-03-01T00:00:00Z"
  AND steps.interval.start_time < "2026-03-02T00:00:00Z"

طلب خطوات البحث حسب النطاق الزمني المدني

خطوات طلب البحث ليوم كامل في 4 مارس 2026، نسبةً إلى الساعة المحلية للمستخدم:

GET https://health.googleapis.com/v4/users/me/dataTypes/steps/dataPoints
  ?filter=steps.interval.civil_start_time >= "2026-03-04"
  AND steps.interval.civil_start_time < "2026-03-05"

طلب بيانات نسبة الدهون بالجسم حسب وقت أخذ العيّنة

طلب البحث عن قياسات نسبة الدهون بالجسم المسجّلة اعتبارًا من مارس 2026 (بالتوقيت العالمي المنسَّق):

GET https://health.googleapis.com/v4/users/me/dataTypes/body-fat/dataPoints
  ?filter=body_fat.sample_time.physical_time >= "2026-03-01T00:00:00Z"

وزن طلب البحث حسب وقت العيّنة المدنية

سجلات وزن طلب البحث التي تم تسجيلها بعد وقت محلي معيّن:

GET https://health.googleapis.com/v4/users/me/dataTypes/weight/dataPoints
  ?filter=weight.sample_time.civil_time >= "2026-03-01T08:00:00"

طلب ملخّصات يومية عن تغيُّر معدّل نبضات القلب

طلب البحث عن الملخّصات اليومية لتغيُّر معدّل نبضات القلب (HRV) المسجّلة قبل تاريخ معيّن:

GET https://health.googleapis.com/v4/users/me/dataTypes/daily-heart-rate-variability/dataPoints
  ?filter=daily_heart_rate_variability.date < "2026-08-15"

طلب البحث عن جلسات التمارين الرياضية حسب وقت البدء المدني

للاستعلام عن جلسات التمارين التي تم إجراؤها خلال أسبوع معيّن في المنطقة الزمنية المحلية للمستخدم، استخدِم ما يلي:

GET https://health.googleapis.com/v4/users/me/dataTypes/exercise/dataPoints
  ?filter=exercise.interval.civil_start_time >= "2026-03-01"
  AND exercise.interval.civil_start_time < "2026-03-08"

طلب بيانات جلسات النوم حسب وقت الانتهاء المدني

طلب بيانات سجلّات النوم حسب وقت انتهاء الجلسة:

GET https://health.googleapis.com/v4/users/me/dataTypes/sleep/dataPoints
  ?filter=sleep.interval.civil_end_time >= "2026-03-04T05:00:00"
  AND sleep.interval.civil_end_time < "2026-03-04T12:00:00"

طلب بيانات تخطيط كهربية القلب حسب وقت البدء

طلب تسجيلات مخطَّط كهربية القلب (ECG) بدءًا من نقطة زمنية فعلية بالتوقيت العالمي المنسّق يُرجى العِلم أنّ طلبات البحث عن مخطط كهربية القلب لا تتوافق إلا مع مقارنة >= في start_time:

GET https://health.googleapis.com/v4/users/me/dataTypes/electrocardiogram/dataPoints
  ?filter=electrocardiogram.interval.start_time >= "2026-03-10T12:00:00Z"

الفلترة حسب مجموعة مصادر البيانات

مجموعة مصادر البيانات هي مجموعة منطقية من مصادر البيانات (مثل الساعات الذكية أو تطبيقات الأجهزة الجوّالة أو الإدخالات اليدوية). تتيح لك هذه الميزة عزل البيانات أو تجميعها من أنواع معيّنة من المصادر (مثل الأجهزة القابلة للارتداء أو الإدخالات اليدوية أو البيانات التي يكتبها العميل الخاص بك).

تتيح نقاط النهاية list وreconcile وrollUp وdailyRollUp استخدام المعلَمة dataSourceFamily. تعتمد آلية تمرير البيانات على نقطة النهاية:

نقطة النهاية (طريقة HTTP) الآلية
‫list (GET) مرِّر dataSourceFamily كمعلَمة طلب بحث في عنوان URL.
‫reconcile (GET) مرِّر dataSourceFamily كمعلَمة طلب بحث في عنوان URL.
‫rollUp (POST) مرِّر dataSourceFamily كحقل في نص طلب JSON.
‫dailyRollUp (POST) مرِّر dataSourceFamily كحقل في نص طلب JSON.

مجموعات مصادر البيانات المتوافقة

يوضّح الجدول التالي قيم dataSourceFamily المتوافقة:

Option الوصف
users/me/dataSourceFamilies/all-sources القيمة التلقائية (عند منح نطاق قراءة). يتضمّن نقاط بيانات من جميع مصادر بيانات الطرف الأول (1P) والطرف الثالث (3P) المتاحة. يتم عرض بيانات التطبيقات الخارجية مع هذا الخيار (مثل خطوات الساعة الذكية + خطوات التطبيقات الخارجية + خطوات الهاتف الجوّال + الخطوات التي تم إدخالها يدويًا).
users/me/dataSourceFamilies/google-wearables تشمل البيانات المسجّلة بواسطة أجهزة التتبُّع من Google وFitbit (مثل أجهزة التتبُّع القابلة للارتداء من Fitbit وPixel Watch). لا يشمل ذلك البيانات التي يتم تسجيلها يدويًا والبيانات المقدَّرة من الهاتف. استخدِم هذا الخيار عندما يتطلّب التكامل بيانات قياس عن بُعد من أجهزة الاستشعار يتم تسجيلها مباشرةً بواسطة أجهزة قابلة للارتداء.
users/me/dataSourceFamilies/google-sources يتضمّن مصادر Google وFitbit التابعة للطرف الأول. ويشمل ذلك سجلات أجهزة التتبُّع البدني والبيانات من Health Connect وأي إدخالات يدوية تم تسجيلها من خلال تطبيقات تابعة لجهات أولى (مثل تطبيق Fitbit أو Google Fit).
users/me/dataSourceFamilies/self-sources تتضمّن هذه السمة البيانات التي كتبها العميل الذي يطلب البيانات من خلال Google Health API فقط (نقاط البيانات التي تم تسجيل مصدر بياناتها من خلال واجهة برمجة التطبيقات باستخدام معرّف عميل OAuth نفسه الذي يستخدمه طالب البيانات).

إذا لم تتطابق أي نقطة بيانات مع مجموعة مصادر البيانات المطلوبة، ستكون الاستجابة عبارة عن قائمة فارغة بدلاً من خطأ.

نطاقات الكتابة فقط والمصادر الذاتية

يمكن للمتصلين الذين تم منحهم نطاقات الكتابة فقط (مثل .activity_and_fitness.writeonly) لأنواع البيانات المطلوبة قراءة البيانات التي كتبوها بأنفسهم، وتلك البيانات فقط.

  • يتم حصر الطلبات التي لا تتضمّن المَعلمة dataSourceFamily بشكل صريح أو التي تم ضبط قيمة dataSourceFamily فيها على users/me/dataSourceFamilies/self-sources ضمنيًا على self-sources.
  • سيؤدي طلب أي مجموعة أخرى من مصادر البيانات (مثل all-sources أو google-wearables أو google-sources) مع نطاق الكتابة فقط إلى حدوث الخطأ 403 Forbidden (PERMISSION_DENIED).

قيود أنواع البيانات في نقطة نهاية القائمة

في نقطة النهاية list (users.dataTypes.dataPoints.list)، لا تتوفّر إمكانية الفلترة حسب dataSourceFamily لأنواع البيانات sleep وfood وfood-measurement-unit:

  • يؤدي ضبط dataSourceFamily بشكل صريح على list لـ sleep أو food أو food-measurement-unit إلى حدوث خطأ 400 Bad Request (INVALID_ARGUMENT).
  • سيؤدي استدعاء list لأنواع البيانات هذه عند منح نطاق كتابة فقط (حيث يكون القيد على self-sources مضمّنًا في نطاقات المتصل) إلى حدوث خطأ 403 Forbidden (PERMISSION_DENIED).
  • لفلترة نقاط بيانات sleep حسب dataSourceFamily، استخدِم نقطة النهاية reconcile بدلاً من ذلك.

أمثلة على عائلات مصادر البيانات

لعرض نقاط البيانات الأولية التي كتبها عميلك الخاص لأحد المستخدمين، استدعِ نقطة النهاية list باستخدام مَعلمة طلب البحث dataSourceFamily التي تم ضبطها على users/me/dataSourceFamilies/self-sources.

على سبيل المثال، يعرض طلب استرداد بيانات باستخدام GET التالي قياسات body-fat الأولية التي كتبها العميل الذي يطلب البيانات بدءًا من 01-03-2026:

طلب

GET https://health.googleapis.com/v4/users/me/dataTypes/body-fat/dataPoints
  ?dataSourceFamily=users/me/dataSourceFamilies/self-sources
  &filter=body_fat.sample_time.physical_time >= "2026-03-01T00:00:00Z"
Authorization: Bearer access-token
Accept: application/json

الردّ

{
  "dataPoints": [
    {
      "name": "users/123456789/dataTypes/body-fat/dataPoints/1234567890",
      "dataSource": {
        "recordingMethod": "UNKNOWN",
        "application": {
          "packageName": "",
          "webClientId": "",
          "googleWebClientId": "google-web-client-id"
        },
        "platform": "GOOGLE_WEB_API"
      },
      "bodyFat": {
        "sampleTime": {
          "physicalTime": "2026-03-10T10:00:00Z",
          "utcOffset": "0s",
          "civilTime": {
            "date": {
              "year": 2026,
              "month": 3,
              "day": 10
            },
            "time": {
              "hours": 10
            }
          }
        },
        "percentage": 20
      }
    }
  ],
  "nextPageToken": ""
}

للحصول على مصدر بيانات موحّد من مجموعة مصادر بيانات معيّنة، استخدِم نقطة النهاية reconcile مع مَعلمة طلب البحث dataSourceFamily.

على سبيل المثال، يجلب طلب استرداد بيانات باستخدام GET التالي بيانات النوم المسجّلة باستخدام جهاز تتبُّع في اليوم التالي لتاريخ 03-03-2026:

طلب

GET https://health.googleapis.com/v4/users/me/dataTypes/sleep/dataPoints:reconcile
  ?dataSourceFamily=users/me/dataSourceFamilies/google-wearables
  &filter=sleep.interval.civil_end_time >= "2026-03-03"
Authorization: Bearer access-token
Accept: application/json

الردّ

{
  "dataPoints": [
    {
      "name": "users/2515055256096816351/dataTypes/sleep/dataPoints/2724123844716220216",
      "dataSource": {
        "recordingMethod": "DERIVED",
        "device": {
          "displayName": "Charge 6"
        },
        "platform": "FITBIT"
      },
      "sleep": {
        "interval": {
          "startTime": "2026-03-03T20:57:30Z",
          "startUtcOffset": "0s",
          "endTime": "2026-03-04T04:41:30Z",
          "endUtcOffset": "0s"
        },
        "type": "STAGES",
        "stages": [
          {
            "startTime": "2026-03-03T20:57:30Z",
            "startUtcOffset": "0s",
            "endTime": "2026-03-03T20:59:30Z",
            "endUtcOffset": "0s",
            "type": "AWAKE",
            "createTime": "2026-03-04T04:43:40.937183Z",
            "updateTime": "2026-03-04T04:43:40.937183Z"
          },
          {
            "startTime": "2026-03-04T04:07:30Z",
            "startUtcOffset": "0s",
            "endTime": "2026-03-04T04:41:30Z",
            "endUtcOffset": "0s",
            "type": "AWAKE",
            "createTime": "2026-03-04T04:43:40.937183Z",
            "updateTime": "2026-03-04T04:43:40.937183Z"
          }
        ],
        "metadata": {
          "stagesStatus": "SUCCEEDED",
          "processed": true,
          "main": true
        },
        "summary": {
          "minutesInSleepPeriod": "464",
          "minutesAfterWakeUp": "0",
          "minutesToFallAsleep": "0",
          "minutesAsleep": "407",
          "minutesAwake": "57",
          "stagesSummary": [
            {
              "type": "AWAKE",
              "minutes": "56",
              "count": "12"
            },
            {
              "type": "LIGHT",
              "minutes": "198",
              "count": "19"
            },
            {
              "type": "DEEP",
              "minutes": "114",
              "count": "10"
            },
            {
              "type": "REM",
              "minutes": "94",
              "count": "4"
            }
          ]
        },
        "createTime": "2026-03-04T04:43:40.337983Z",
        "updateTime": "2026-03-04T04:43:40.937183Z"
      }
    }
  ],
  "nextPageToken": ""
}

لتجميع نقاط البيانات على مدى فترة زمنية محدّدة ضمن مجموعة معيّنة من مصادر البيانات، يمكنك طلب نقطة النهاية rollUp وتمرير الحقل dataSourceFamily في نص طلب JSON.

يستعلم طلب POST التالي عن عدد خطوات المشي خلال اليوم على فترات زمنية كل ساعة (3600s)، ويتم تجميع البيانات حصريًا من الأجهزة القابلة للارتداء:

طلب

POST https://health.googleapis.com/v4/users/me/dataTypes/steps/dataPoints:rollUp
Authorization: Bearer access-token
Accept: application/json

{
  "range": {
    "startTime": "2026-07-29T00:00:00Z",
    "endTime": "2026-07-29T23:59:59Z"
  },
  "windowSize": "3600s",
  "dataSourceFamily": "users/me/dataSourceFamilies/google-wearables"
}

الردّ

{
  "rollupDataPoints": [
    {
      "startTime": "2026-07-29T08:00:00Z",
      "endTime": "2026-07-29T09:00:00Z",
      "steps": {
        "countSum": "1200"
      }
    },
    {
      "startTime": "2026-07-29T09:00:00Z",
      "endTime": "2026-07-29T10:00:00Z",
      "steps": {
        "countSum": "3450"
      }
    }
  ]
}

لتجميع نقاط البيانات اليومية لعائلة مصدر معيّنة، استدعِ نقطة النهاية dailyRollUp وأدخِل الحقل dataSourceFamily في نص الطلب.

على سبيل المثال، يحسب الطلب التالي عمليات التجميع اليومية لخطوات المستخدم، بما في ذلك جميع مصادر Google وFitbit التابعة للطرف الأول (الأجهزة القابلة للارتداء والإدخالات اليدوية):

طلب

POST https://health.googleapis.com/v4/users/me/dataTypes/steps/dataPoints:dailyRollUp
Authorization: Bearer access-token
Accept: application/json

{
  "range": {
    "start": {
      "date": {
        "year": 2026,
        "month": 7,
        "day": 28
      },
      "time": {
        "hours": 0,
        "minutes": 0,
        "seconds": 0,
        "nanos": 0
      }
    },
    "end": {
      "date": {
        "year": 2026,
        "month": 7,
        "day": 30
      },
      "time": {
        "hours": 0,
        "minutes": 0,
        "seconds": 0,
        "nanos": 0
      }
    }
  },
  "windowSizeDays": 1,
  "dataSourceFamily": "users/me/dataSourceFamilies/google-sources"
}

الردّ

{
  "rollupDataPoints": [
    {
      "civilStartTime": {
        "date": {
          "year": 2026,
          "month": 7,
          "day": 28
        },
        "time": {}
      },
      "civilEndTime": {
        "date": {
          "year": 2026,
          "month": 7,
          "day": 28
        },
        "time": {
          "hours": 23,
          "minutes": 59,
          "seconds": 59
        }
      },
      "steps": {
        "countSum": "8430"
      }
    },
    {
      "civilStartTime": {
        "date": {
          "year": 2026,
          "month": 7,
          "day": 29
        },
        "time": {}
      },
      "civilEndTime": {
        "date": {
          "year": 2026,
          "month": 7,
          "day": 29
        },
        "time": {
          "hours": 23,
          "minutes": 59,
          "seconds": 59
        }
      },
      "steps": {
        "countSum": "11245"
      }
    }
  ]
}