Дата Java - 12 утра хранится как 24? - PullRequest
2 голосов
/ 17 ноября 2011

Итак, я и мой партнер работаем над этим проектом некоторое время. Мы работаем с датами ОЧЕНЬ МНОГО в этом проекте, и мы недавно заметили проблему, и мы довольно глубоко в этом месте.

Мы храним наше время в SQLlite (проект Android) в виде отформатированной строки, так как большую часть времени они напрямую связаны со списками и т. Д.

Проблема, которую мы заметили, которая показалась мне странной, заключается в том, что этот объект SimpleDateTimeFormat, когда используется для форматирования до 24-часового времени (это медицинский проект, поэтому 24-часовое время - это соглашение здесь) 12:00 утра 12:59 утра отформатированы в 24: 00-24: 59 вместо 00: 00-00: 59 ...

Это не слишком большая проблема, пока мы не запросим базу данных и не упорядочим результаты по датам. Любые данные, которые находятся между 12:00 и 00:59, будут отображаться в конце списка, но это должно показать в начале ...

Кто-нибудь еще сталкивался с этой проблемой? или знаете способ обойти это? Лучше всего было бы сохранить данные в формате 00:00, а не 24:00.

Приветствия

Ответы [ 3 ]

5 голосов
/ 17 ноября 2011

Я сильно подозреваю, что вы используете неправильный шаблон.Мы должны догадаться, так как вы не опубликовали никакого кода (подсказку, подсказку), но я подозреваю вы используете шаблон, например

kk:mm:ss

вместо

HH:mm:ss

Пример кода:

import java.util.*;
import java.text.*;

public class Test {
    public static void main(String[] args) throws Exception {
        SimpleDateFormat broken = new SimpleDateFormat("kk:mm:ss");
        broken.setTimeZone(TimeZone.getTimeZone("Etc/UTC"));
        SimpleDateFormat working = new SimpleDateFormat("HH:mm:ss");
        working.setTimeZone(TimeZone.getTimeZone("Etc/UTC"));

        Date epoch = new Date(0);

        System.out.println(broken.format(epoch));
        System.out.println(working.format(epoch));
    }
}

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

1 голос
/ 17 ноября 2011

Пожалуйста, прочитайте это и это о том, как SQLite хранит даты (или не хранит даты).SQLite не имеет типа «Дата», поэтому он хранится в виде строки.Вы должны сохранить дату как целое число (миллисекунды), а затем вы можете использовать функции даты и времени, чтобы извлечь их (из первой ссылки).

Из документации

1.2 Дата и время Тип данных

В SQLite не предусмотрен класс хранения, предназначенный для хранения дат и / или времени.Вместо этого встроенные функции даты и времени в SQLite могут сохранять даты и время в виде значений TEXT, REAL или INTEGER:

TEXT в виде строк ISO8601 ("YYYY-MM-DD HH: MM: SS.SSS ").НАСТОЯЩЕЕ, как юлианские числа, число дней с полудня в Гринвиче 24 ноября 4714 г. до н.э. в соответствии с Григорианским календарем.INTEGER как Unix Time, количество секунд с 1970-01-01 00:00:00 UTC.Приложения могут сохранять даты и время в любом из этих форматов и свободно конвертировать между форматами, используя встроенные функции даты и времени.

Я предпочитаю хранение времени INTEGER / Unix, затем использую встроенноефункции даты и времени для форматирования при извлечении из БД.

РЕДАКТИРОВАТЬ: Кроме того, это позаботится о сортировке.Я предполагаю, что ваша текущая "сортировка" дат в SQLite основана на строках, что плохо mmmmkay.

0 голосов
/ 17 ноября 2011

Какую строку формата вы передаете в SimpleDateFormat ? Согласно документам, использование «H» для часов должно давать вам 0–23, а «k» - 1-24.

...