سؤال

ما هي الطريقة الاصطلاحية للحصول على وقت النظام باعتباره LocalDateTime في وقت نودا؟الطريقة الأكثر مباشرة التي يمكن أن أفكر بها هي

var dt = DateTime.Now
LocalDateTime systemTime = new LocalDateTime(dt.Year, dt.Month, dt.Day, dt.Hour, dt.Minute);

ولكن نظرا لأن نودا الوقت الغرض بأكمله هو استبدال DateTime بشيء له دلالات أجمل, ، افترضت أن هناك طريقة مفضلة بدلاً من الاستخدام DateTime بالطريقة المذكورة أعلاه.أفضل ما يمكنني التوصل إليه باستخدام مرافق نودا هو

var zone = NodaTime.TimeZones.BclDateTimeZone.ForSystemDefault();
LocalDateTime systemTime = SystemClock.Instance.Now.InZone(zone).LocalDateTime;

ولكن هذا يبدو مطولاً تماماً.

هل كانت مفيدة؟

المحلول

المثال الثاني هو بالضبط كيف ستفعل هذا.إنها عمدا مطول.يرى فلسفة تصميم نودا تايم.

فكر في الأمر في ثلاثة أجزاء:

  1. الحصول على اللحظة الحالية في الوقت المناسب:

    // Instant now = SystemClock.Instance.Now;               // NodaTime 1.x
    Instant now = SystemClock.Instance.GetCurrentInstant();  // NodaTime 2.x
    
  2. احصل على المنطقة الزمنية للنظام.(هذا هو بناء الجملة المفضل)

    DateTimeZone tz = DateTimeZoneProviders.Bcl.GetSystemDefault();
    
  3. تطبيق المنطقة الزمنية على اللحظة:

    ZonedDateTime zdt = now.InZone(tz);
    

خطوتك الأخيرة للحصول على LocalDateTime يعد أمرًا تافهًا، ولكن عليك أن تدرك أنه عندما تفعل ذلك، فإنك تزيل أي معلومات عن المنطقة الزمنية."المحلي" في NodaTime يفعل ذلك لا يعني "محلي للكمبيوتر حيث يتم تشغيل التعليمات البرمجية".(وبعبارة أخرى، ليس الأمر كذلك DateTimeKind.Local)

أشياء إضافية للتفكير فيها:

  • قد تفضل تجريد الساعة باستخدام IClock واجهه المستخدم:

    IClock clock = SystemClock.Instance;
    // Instant now = clock.Now;               // NodaTime 1.x
    Instant now = clock.GetCurrentInstant();  // NodaTime 2.x
    

    بعد ذلك، يمكنك تمرير الساعة كمعلمة طريقة، أو حقنها باستخدام إطار عمل DI/IoC المفضل لديك.(Autofac، Ninject، StructureMap، أيًا كان...).الميزة هي أنه يمكنك استخدام أ NodaTime.Testing.FakeClock أثناء اختبارات الوحدة الخاصة بك.يرى اختبار الوحدة باستخدام Noda Time لمزيد من التفاصيل.

  • قد تفضل أيضًا المرور في DateTimeZone حتى تتمكن من تشغيل التعليمات البرمجية الخاصة بك في أي مكان دون التقيد بالمنطقة الزمنية للنظام.يعد هذا أمرًا مهمًا لتطبيقات الخادم، ولكنه أقل أهمية لتطبيقات سطح المكتب/الهاتف المحمول.

  • إذا كان لديك عمل آخر يستخدم المناطق الزمنية لـ IANA، أو إذا كنت تستخدم الإصدار .NET Standard من Noda Time، فقم بتغيير الخطوة 2 لاستخدام Tzdb مزود:

    DateTimeZone tz = DateTimeZoneProviders.Tzdb.GetSystemDefault();
    

    تعد مناطق TZDB أكثر دقة من مناطق BCL.سيقوم Noda Time بتعيين المنطقة الزمنية لنظام Windows (BCL) الخاصة بك إلى المنطقة الزمنية IANA (TZDB) في هذه المكالمة الأولية.

إذا كان لديك فضول لمعرفة السبب DateTime.Now مضغوط جدًا بينما Noda Time مطول جدًا، حاول فك ترجمته DateTime.Now أو النظر في المصادر المرجعية لمرض التصلب العصبي المتعدد.سترى أنها تقوم بنفس الخطوات بشكل أساسي أسفل الغطاء.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top