QT 5.15.2 QDate::DaysTo возвращает 0, несмотря на то, что все типы переменных верны

Я хочу найти файлы в папке и проверить, сколько им лет.

У меня есть этот фрагмент кода, который не работает так, как я ожидаю, согласно документации и примерам, которым я следовал:

const QDate today = QDate::currentDate();
Q_FOREACH(auto fileInfo, QDir("folderName").entryInfoList(QDir::Files)) {
    
    // These variables are added to the watch table to see their values
    auto test1 = fileInfo.created().date().daysTo(today);
    auto test2 = fileInfo.baseName();
    auto test3 = fileInfo.suffix();
}

Я добавляю переменные test1, test2, test3 в таблицу наблюдения, чтобы посмотреть, какие у них значения.

Мне кажется, что daysTo(today) возвращает 0, потому что today — недопустимый формат. Это в юлианский день. Но он имеет тип QDate, а QDate::daysTo(QDate d) требует переменную типа QDate в качестве параметра. Мне это кажется правильным?

И правильные файлы также находятся, сверившись с базовым именем и суффиксом. И им не 0 дней... Скорее месяц или около того.

Почему daysTo возвращается 0, хотя вроде бы все в порядке?

Я использую QT 5.15.2.

Обновление: я добавил еще несколько тестов и изменил функцию create() наbirthTime(). См. комментарии к результатам, которые я нахожу при просмотре переменных в таблице наблюдения:

    const QDate today = QDate::currentDate();
    Q_FOREACH(auto fileInfo, QDir("folderName").entryInfoList(QDir::Files)) {

        auto test1 = fileInfo.birthTime().date().daysTo(today);         // Gives "0"
        auto test11 = fileInfo.birthTime();                             // Gives "msecs=280348"
        bool test111 = test31.isValid();                                // Gives "true"
        auto test12 = fileInfo.birthTime().date();                      // Gives "Julian day=2460417"
        auto test13 = fileInfo.fileTime(QFileDevice::FileBirthTime);    // Gives "msecs=280311"
        auto test2 = fileInfo.baseName();                               // Gives "filename"
        auto test3 = fileInfo.suffix();                                 // Gives ".jpg"

Подключите отладчик к своему коду и перейдите к вызову метода daysTo, чтобы узнать, что произойдет.

Botje 16.04.2024 10:39
QFileInfo не имеет created() метода
Fareanor 16.04.2024 10:41

Хм, ок, вместо этого я переключил созданный() на рождениеВремя(), но он дает те же результаты. Я также попробовал разделить ряд функций @ переменной test1. Я обнаружил, что независимо от использования метода create() илиbirthTime() он вернет сегодняшнюю дату, как будто он принимает дату создания файловой переменной, а не самого реального файла...

Daddedebad 16.04.2024 10:57

@wohlstad Ой, извини, извини, я этого не знал, я не смог найти это в онлайн-документе для Qt 5.12 :/

Fareanor 16.04.2024 10:58

Может быть, времени нет? Я только что прочитал из документации: Если время рождения файла недоступно, эта функция возвращает недопустимое значение QDateTime.

Fareanor 16.04.2024 11:04

Судя по тому, что я вижу, он возвращает действительный QDateTime: когда я прохожу мимо функции, у нее есть data->status=176 и data->msecs=282896. Кажется, он измеряет количество мсек, в течение которых он был жив, или что-то в этом роде. По крайней мере, это не выглядит недействительным. Я тоже не знаю, что означает статус, оба поля меняются при каждом выполнении.

Daddedebad 16.04.2024 11:11

Просто ради интереса: откуда вы знаете, что daysTo всегда возвращает 0 — показанный код вообще не использует результат test1? Пожалуйста, предоставьте минимальный воспроизводимый пример, который можно использовать для демонстрации проблемы.

G.M. 16.04.2024 11:13

Я добавляю переменную test1 в таблицу наблюдения и обнаруживаю, что таким образом могу получить больше информации из переменной, а не печатать ее или что-то подобное. То же самое и с другими переменными.

Daddedebad 16.04.2024 11:15
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
9
56
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Теперь я нашел свое решение. В коде не было ничего плохого (за исключением использования устаревшей функции create()), а поле msecs в переменной QDate было отвлекающим маневром...

Проблема заключалась в том, что файлы сбрасывали время своего рождения при копировании в новое место. Поэтому они считаются созданными в тот день: сегодня.

Таким образом, даже если операционная система распознает файлы месячной давности, fileInfo.birthTime() или fileInfo.fileTime(QFileDevice::FileBirthTime) не отражает это. Я также попробовал QFileDevice::FileMetadataChangeTime, и это тоже не сработало.

Я заметил это, когда проверял прошедшие секунды вместо дней, используя secsTo() и QDateTime вместо днейTo() и QDate. Если бы я оставил скопированные файлы в папке нетронутыми в течение дня, я бы увидел, что им 1 день.

Что ж, причина этого довольно очевидна, если вдуматься: вы копируете файл. Представьте себе, что кто-то пишет свой дневник в 1042 году. Затем кто-то находит этот журнал в 1346 году и думает, что было бы хорошо сделать «книгу», поэтому он делает копию ее содержания, переписанную вручную. То же самое происходит и в 1680 году, но уже с подвижными типами. Кто-то другой делает то же самое в 1912 году, печатая книгу по изданию 1346 года (идентичному изданию 1680 года). В 1999 году еще один переписывает его в виде обычного текста, а еще один в 2024 году — в формате PDF. Когда дата рождения PDF-файла?

musicamante 17.04.2024 03:50

Другие вопросы по теме