strftime не отображает год правильно - PullRequest
1 голос
/ 05 апреля 2010

У меня есть следующий код ниже:

const char* timeformat = "%Y-%m-%d %H:%M:%S";
const int timelength = 20;
char timecstring[timelength];

strftime(timecstring, timelength, timeformat, currentstruct);

cout << "timecstring is: " << timecstring << "\n";

currentstruct является тм *.Cout дает мне дату в правильном формате, но это не 2010 год, а 3910. Я знаю, что есть какое-то отношение к годовой кунде, начинающейся в 1900 году, но я не уверен, как заставить это время распознать это, а недобавьте 1900 к значению 2010 года, которое может быть, любой может помочь.

С уважением

Пол

Ответы [ 3 ]

5 голосов
/ 05 апреля 2010

Поле tm_year для struct tm по определению является числом лет с 1900 года. Каждый фрагмент кода, который имеет дело с struct tm, ожидает, что это так. Вы не можете установить tm_year на 2010 и ожидать, что код волшебным образом определит, что вы действительно имеете в виду 2010 год, а не 3910.

Установите tm_year на 110, и strftime будет работать.

3 голосов
/ 05 апреля 2010

Когда вы вводите год в currentstruct, вы, очевидно, вводите 2010, но вам нужно ввести 2010-1900.

Если вы извлекаете время из системы и конвертируете в struct tm что-то вроде localtime, вам не нужно делать никакого вычитания, потому что то, что оно помещает в struct tm, это уже год - 1900. Вам нужно вычесть 1900, когда вы вводите год «вручную».

0 голосов
/ 05 апреля 2010

Похоже, currentstruct->tm_year - это 2010, что означает дату в году 3910. Чтобы это исправить, чтобы указывать дату в этом году, вместо этого вам нужно будет сделать

currentstruct->tm_year -= 1900;

Невозможно сказать strftime (или другим системным функциям), что ваш struct tm на самом деле не struct tm, потому что он следует другим соглашениям, чем система навязывает (например, вы хотите, чтобы годы начинались с 0 чем с 1900 г.).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...