سؤال

لدي تاريخ مخزّن كـ java.sql.timestamp في قاعدة بيانات. التاريخ هو "2010-01-20T19: 10: 35.000Z" وهو يعادل 1264014635743 مللي ثانية.

بطريقة ما ، يتم تنسيق التاريخ بشكل مختلف على جهاز prod مقارنة بجهاز dev.

الرمز لتنسيق التاريخ هو:

private final static String DATE_FORMAT = "yyyy-MM-dd";
public final static SimpleDateFormat APP_DATE_FORMATER = new SimpleDateFormat(DATE_FORMAT);
private static final TimeZone UTC_TIMEZONE = TimeZone.getTimeZone("Etc/UTC");
APP_DATE_FORMATER.setTimeZone(UTC_TIMEZONE);
DateTimeZone.setDefault(DateTimeZone.UTC);

String output = APP_DATE_FORMATER.format(date)

الإخراج الذي تم إنشاؤه في DEV هو "2010-01-20" الصحيح. ولكن في Prod لدي "2010-01-21" ، بعد يوم واحد!

بالطبع ، نظرًا لأن الخطأ يحدث على خادم Prod ، فأنا محدود في خيارات تصحيح الأخطاء ...

لدي فحص مزدوج ، وكلا الخادم لديهم نفس الوقت والمنطقة الزمنية. تتم مزامنة كل الساعة مع خادم NTP.


تحديث] تحتوي قاعدة البيانات في PROD على القيمة: "10-01-20 19: 10: 35،743000000" لحقل التاريخ

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

المحلول

فكرتي الأولى هي أن هذه قضية تزامن. SimpleDateFormat هو ليس آمن الخيط ، ومع ذلك فأنت تشارك مثيلًا ثابتًا. إذا كنت بحاجة إلى استخدام java.text التنسيقات في بيئة متعددة الخيوط ، يجب عليك استخدام threadlocal للاحتفاظ بها:

private static ThreadLocal<DateFormat> _datetimeFormatter = new ThreadLocal<DateFormat>();

private static DateFormat getDatetimeFormatter()
{
    DateFormat format = _datetimeFormatter.get();
    if (format == null)
    {
        format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
        format.setTimeZone(TimeZone.getTimeZone("GMT"));
        _datetimeFormatter.set(format);
    }
    return format;
}

public static String formatDatetime(Date date)
{
    return getDatetimeFormatter().format(date);
}

من الممكن أيضًا (ولكن من غير المحتمل) عدم العثور على "ETC/UTC" على الخادم. هل تقوم بتسجيل القيمة من getTimeZone()?

والخيار الثالث هو ، إعادة صياغة Inigo Montoya, ، "أنت لا تدير الرمز الذي تعتقد أنك تديره." قد يكون ذلك لأن رمز العرض التقديمي الخاص بك لم يفرغ بشكل صحيح على الخادم ، أو أن هناك تاريخًا آخر يطفو حوله.

نصائح أخرى

في حين أن الآلات لديها نفس المنطقة الزمنية ، ماذا عن إعدادات قاعدة البيانات؟ هل من الممكن تعيين قاعدة البيانات على منطقة زمنية مختلفة عن الجهاز؟

هل راجعت أن إعدادات JVM هي نفسها على آلات الإنتاج والتطوير؟ قد تكون الأوقات متزامنة على مستوى الخادم ، ولكن ربما تكون الطريقة التي يتم بها إعداد JVM هي بعض الالتباس حول المنطقة الزمنية الموجودة فيه.

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