سؤال

استمرار محاولتي لإنشاء فئة DateTime ، أحاول تخزين وقت "Epoch" في وظيفتي:

void DateTime::processComponents(int month, int day, int year, 
                                 int hour, int minute, int second) {
    struct tm time;
    time.tm_hour = hour;
    time.tm_min = minute;
    time.tm_sec = second;
    time.tm_mday = day;
    time.tm_mon = month;
    time.tm_year = year - 1900;
    ticks_ = mktime(&time);

    processTm(time);
}

void DateTime::processTm(struct tm time) {
    second_ = time.tm_sec;
    minute_ = time.tm_min;
    hour_ = time.tm_hour;
    weekday_ = time.tm_wday;
    monthday_ = time.tm_mday;
    yearday_ = time.tm_yday;
    month_ = time.tm_mon;
    year_ = time.tm_year + 1900;
}

لتاريخ تعسفي، processComponents(5,5,1990,1,23,45) (6 يونيو 1990 1:23:45 صباحا)، إنه يحدد جميع القيم بشكل صحيح وكوقع.

ومع ذلك، عند إجراء مزيد من الاختبار، أجد ذلك processComponents(0,0,1970,0,0,0) (1 يناير 1970، 12:00:00 ص)، mktime(&time) أسباب time ليتم ثمل:

time.tm_mon  = 11;
time.tm_mday = 30;
time.tm_year = 69;
time.tm_hour = 23;
time.tm_min  = 0;
time.tm_sec  = 0;

time.tm_isdst  = 0;
time.tm_gmtoff = -18000;
time.tm_zone   = "EST";
time.tm_wday   = 2;
time.tm_yday   = 363;

ترجمة إلى تاريخ 31 ديسمبر 1969 11:00:00 PM.

يمكنني التحقق من ذلك mktime() مسؤول، لأنه من خلال التعليق على هذا الخط، فإنه يبلغ عن التاريخ والوقت بشكل صحيح ك 1 يناير، 1970 12:00 صباحا.

لماذا mktime() فقط العبث EAPOCH؟ وكيف يجب أن إصلاح / الحل هذه؟

شكرا!

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

المحلول

أنت تمر 0 كما day المعلمة ووضع ذلك في time.tm_mday. وبعد هذا المكون (وفقط هذا المكون) من struct tm هو 1- مقرها، وليس 0-

لا تسألني لماذا.

لتحديد 01 يناير 1970، 12:00:00 صباحا تريد أن تسميها مثل ذلك:

processComponents(0,1,1970,0,0,0);

و كما ذكر SDTOM, ، سترغب في التأكد من ذلك tm_isdst تم تعيينه بشكل مناسب - 0 لعدم سريانه، وإيجابي في الواقع، والسلبي بالنسبة لك لا تعرف (في هذه الحالة mktime() يجب أن تحاول تخمين).

فقط لنعلمك، عندما اجتاز التاريخ لديك (0 يناير 1970، 00:00:00) ل mktime() في MSVC 9، إرجاع خطأ (مرت في struct tm لا يمولة وعاد time_t القيمة هي -1).

نصائح أخرى

نظرا لأنها توقفت بالساعة الأولى، أود أن أتوقع وقت الادخار النهار. هي قيمة Time.tm_isdst الحصول على مجموعة في مكان ما؟ إذا لم تقم بإعداده، فقد يتم تعيينه بشكل عشوائي إلى 1 أو 0 مما يؤثر على نتائجك.

تمرير جميع الأصفار ل mktime() يتم تفسيره باسم "Sun Jan 0 00:00:00 1900". بناء على ذلك، يجب أن يكون هناك بعض التعديلات ...

// the input is local time
// the output is seconds since the epoch
// The epoch is Jan 1, 1970 @ 0:00 GMT
time_t mktime_wrapper( int month, int day, int year,
                       int hour=0, int min=0, int sec=0, bool isDST=-1
                     )
   {
   tm t;
   t.tm_sec=sec, t.tm_min=min, t.tm_hour=hour, t.tm_isdst=isDST;
   t.tm_mday=day, t.tm_mon=month-1, t.tm_year=year-1900;
   return mktime( &t );
   }
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top