Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
school_bot
14 / 12 / 3
Регистрация: 23.12.2013
Сообщений: 84
#1

UNIX-time с нуля - C++

03.01.2014, 18:31. Просмотров 1522. Ответов 1
Метки нет (Все метки)

Проблема следующая - реализовал я с нуля перевод из юникс -времени в человечную дату. А тут проблема появилась:
ввожу 54588753952 в свою программу (этот 36 век), а также сюда http://www.cy-pr.com/tools/time/, всё совпадает, не считая разницы в почти 2 недели! В 20 веке, в 19 всё ок. Но уже при вводе 6338155552 (22 век) разница получается один день!
Моя прога:
Введите время в Unix формате
6338155552
Конвертируем:
5.11.2170 6:45:52
На вышеупомянутом сайте:
Tue, 06 Nov 2170 06:45:52 GMT
В ЧЕМ ЖЕ ПРОБЛЕМА? чего я не учитываю, не пойму
Вот код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
#include <stdio.h>
#include <conio.h>
#include <clocale>
 
int main(void)
{
    setlocale(LC_ALL, "rus");
 
    printf("Введите время в Unix формате\n");
    long long int posix;
    scanf("%lld", &posix);
    printf("Конвертируем: \n"); 
    int day = 1, month = 1, year = 1970, hour = 0, min = 0, sec = 0;
    int yearTime = 31536000;
    while (posix >= yearTime) 
    {
        if (!(year % 4)) 
        {
            yearTime = 31622400;
            if (posix < yearTime) 
            {
                break;
            }
        }
        posix -= yearTime;
        year++;
        yearTime = 31536000;
    }
    int febDays = 28;
    if (!(year % 4)) {
        febDays++;
    }
    int days = 1;
    while (posix >= 86400) 
    {
        posix -= 86400;
        days++;
    }
    if (days <= 31) {
        month = 1;
        day = days;
    } else if (days <= 31 + febDays) {
        month = 2;
        day = days - 31;
    } else if (days <= 62 + febDays) {
        month = 3;
        day = days - 31 - febDays;
    } else if (days <= 92 + febDays) {
        month = 4;
        day = days - 62 - febDays;
    } else if (days <= 123 + febDays) {
        month = 5;
        day = days - 92 - febDays;
    } else if (days <= 153 + febDays) {
        month = 6;
        day = days - 123 - febDays;
    } else if (days <= 184 + febDays) {
        month = 7;
        day = days - 153 - febDays;
    } else if (days <= 215 + febDays) {
        month = 8;
        day = days - 184 - febDays;
    } else if (days <= 245 + febDays) {
        month = 9;
        day = days - 215 - febDays;
    } else if (days <= 276 + febDays) {
        month = 10;
        day = days - 245 - febDays;
    } else if (days <= 306 + febDays) {
        month = 11;
        day = days - 276 - febDays;
    } else {
        month = 12;
        day = days - 306 - febDays;
    }
    while (posix >= 3600) 
    {
        posix -= 3600;
        hour++;
    }
    while (posix >= 60) 
    {
        posix -= 60;
        min++;
    }
    sec = posix;
    printf("%d.%d.%d %d:%d:%d\n", day, month, year, hour, min, sec);
 
    printf("\n\n... Нажмите любую клавишу для выхода");
    _getch();
    return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.01.2014, 18:31
Здравствуйте! Я подобрал для вас темы с ответами на вопрос UNIX-time с нуля (C++):

Human Time to Unix Timestamp - C++
Запутался с переводом времени /* Перевод времени из формата %d.%m.%y %H:%M:%S (UTC) * в метку времени Unix Timestamp */ ...

Преобразование даты в Unix-time - C++
Нужна формула или функция для преобразование даты в Unix-time. Например: На вход дата: Sun Apr 26 00:06:00 2015 На выход...

Как преобразовать время из строки в Unix Time? - C++
Получаю &quot;Sat, 18 Jul 2015 19:56:37 +0300&quot; Знаю что можно strptime или бустом, но какой шаблон для такого времени?

Не могу разобраться с заданием "Создайте класс Time с конструкторами Time(), Time( int hour)......" - C++
/* Создайте класс Time с конструкторами Time(), Time( int hour), Time(int hour, int min), Time( int h, int m, int s) и ...

Вычислить среднее арифметическое элементов, расположенных до первого нуля и после последнего нуля - C++
В одномерном массиве, состоящем из п элементов, вычислить: среднее значение элементов, расположенных в массиве между первым последним...

Compile-time и run-time методы и функции - C++
Добрый день. Есть две функции, которые делают идентичную работу: template&lt;bool leftShift, typename T&gt; T byteShift(T data) { ...

1
spam210
0 / 0 / 0
Регистрация: 16.07.2015
Сообщений: 1
20.12.2017, 17:31 #2
каждые 100 лет, кроме (кроме каждого 400 го года) нету 29го февраля
поэтому так и происходит

пример выще богат магическими числами
и нету так же какой день недели(суббота или четверг)
так же нету какой это день в году,(0..366)


позже выложу свой пример

Добавлено через 4 часа 33 минуты
выложу свой пример, сразу скажу что функция высчитывает
от 1го января 1970го до 2099 года
возможно заморочусь потом
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
#define SECONDS_TO_DAY     86400  // сколько секунд в дне
#define HOURS_TO_DAY       24     // часов в дне
#define SECONDS_TO_HOUR    3600   // сколько секунд в часе
#define SECONDS_TO_MIN     60     // сколько секунд в минуте
#define YEAR_START         1970   // Эпоха юникс
#define MONTH_DECEMBER     12     // декабрь
 
typedef struct ts{
  u8              sec;         // seconds 
  u8              min;         // minutes 
  u8              hour;        // hours 
  u8              mday;        // day of the month 
  u8              mday_last;   // last day of the month 
  u8              mon;         // month 
  s16             year;        // year 
  u8              wday;        // day of the week
  leap_year_t     feb29;       // leap or non_leap year
  u16             y_days;      // number a day in the year 1 .. 366
  s32             unixtime;    // seconds since 01.01.1970 00:00:00 UTC timezone 0
    s32             correct;     // correction label
    s8              timezone;    // just timezone
}ts_t;
 
static void clock_unix_to_days(struct ts *tm)
{
  const u16 month[2][12][3]={
    {
      {0,30,31},     // jan
      {31,58,28},    // feb
      {59,89,31},    // mar
      {90,119,30},   // apr
      {120,150,31},  // may
      {151,180,30},  // jun
      {181,211,31},  // jul
      {212,242,31},  // aug
      {243,272,30},  // sep
      {273,303,31},  // oct
      {304,333,30},  // nov
      {334,364,31},  // dec
    },
    {
      {0,30,31},     // jan
      {31,59,29},    // feb
      {60,90,31},    // mar
      {91,120,30},   // apr
      {121,151,31},  // may
      {152,181,30},  // jun
      {182,212,31},  // jul
      {213,243,31},  // aug
      {244,273,30},  // sep
      {274,304,31},  // oct
      {305,334,30},  // nov
      {335,365,31},  // dec
    }
  };
  // время tm->unixtime по гринвичу
  // время с timezone
  s64 epoch = tm->unixtime + (tm->timezone * SECONDS_TO_HOUR); 
  
  tm->feb29 = NON_LEAP;                // високосный год или нет(по умолчанию )
  u16 days = epoch / SECONDS_TO_DAY;   // количество дней прошедших с 01.01.1970
 
  // вычисление часов
  tm->sec =  ( epoch % SECONDS_TO_MIN ) ;
  tm->min =  ( epoch / SECONDS_TO_MIN )  % SECONDS_TO_MIN;
  tm->hour = ( epoch / SECONDS_TO_HOUR ) % HOURS_TO_DAY;
 
  // сколько четверок годов от 1970го до текущего, но не более 2099го
  u32 y_fours  = days / YEAR_4 ;
  // сколько осталось годов 0..(YEAR_4 - 1)
  u16  y_non_fours  = days % YEAR_4; 
  //u16  y_non_fours  = (days - (y_fours * YEAR_4)); // остаток 0..YEAR_4
  
  u8 current_year ;
 
  
  // вычисляем какой год из четырёх и високосен ли он
    if (y_non_fours < YEAR_1 ){
    tm->y_days = y_non_fours + 1;
    current_year = 0;
  }else if (y_non_fours >= YEAR_1 && y_non_fours < YEAR_2 ){
    tm->y_days = y_non_fours - YEAR_1 + 1;
    current_year = 1;
  }else if (y_non_fours >= YEAR_2 && y_non_fours < YEAR_3 ){
    tm->feb29 = LEAP;
    tm->y_days = y_non_fours - YEAR_2 + 1;
    current_year = 2;
  }else if (y_non_fours >= YEAR_3 && y_non_fours < YEAR_4){
    tm->y_days = y_non_fours - YEAR_3 + 1;
    current_year = 3;
  }
  
  
  // определяем какой год
  tm-> year = YEAR_START + (y_fours * 4 ) + current_year;
  
  for (u8 i=0 ; i < MONTH_DECEMBER;i++){
     if ((tm->y_days-1) >= month[(u8)tm->feb29][i][MONTH_START] &&
           (tm->y_days-1) <= month[(u8)tm->feb29][i][MONTH_END]){
       tm->mon = i+1;
       tm->mday=(u8)(tm->y_days-1 - month[(u8)tm->feb29][i][MONTH_START]) + 1;
       tm->mday_last=(u8)(tm->y_days-1 - month[(u8)tm->feb29][i][MONTH_DAYS]) + 1;
       goto exit;
     }
   }
  exit:
  // день недели, портирован, он как раз считает все високосные года
  static const u8 t[] = {0, 3, 2, 5, 0, 3, 5, 1, 4, 6, 2, 4};
    s16 year = tm->year;
    if(tm->mon < 3) --year;
    tm->wday = ((year + (year >> 2) - year / 100 + year / 400 + t[tm->mon - 1] + tm->mday) % 7);
}
Добавлено через 1 минуту
вставить после
C
1
2
3
4
typedef enum {
  NON_LEAP = 0x00,
  LEAP     = 0x01
}leap_year_t;
впихнуть после #define'ов
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.12.2017, 17:31
Привет! Вот еще темы с ответами:

Напишите конструктор для инициализации объекта класса Time, который может использовать текущее время, возвращаемое функцией time (). - C++
Помогите пожалуйста написать программу на С++. Просто скоро курсовую сдавать, а классы мы еще не разобрали и не успеваем. Поэтому не знаю...

Класс Time через time(0) - C++
Всем привет. На форуме искал ничего похожего не нашол. Не могу до конца разобраться. В класе 1 член, который держит секунды, которые...

Класс "Время". Двусмысленность между time и std:time(long*) - C++
Здравствуйте. Дали код, сказали есть проблема(скриншот): http://joxi.ru/12MxOENhw14QmJ Код: # include &lt;iostream.h&gt; # include...

Что за ошибка: "E2015 Ambiguity between 'time' and 'std::time"? - C++
Коды ошибок: v8.cpp(132): E2015 Ambiguity between 'time' and 'std::time(long *)' v8.cpp(133): E2015 Ambiguity between 'time' and...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru