Уникальный int от Date - PullRequest
3 голосов
/ 12 января 2011

Это общее программирование, но я работаю на Java.

Учитывая дату dd-mm-yy или dd-mm-yyyy (например, 13-01-2011) Я хочу преобразовать это в уникальный номер, такойчто любые две даты имеют разные номера.И год не важен.Так что простое преобразование dd-mm в одно уникальное int приемлемо.Кто-нибудь знает алгоритм для этого?

Я сожалею: я хочу быть более конкретным:

Уникальные числа должны быть от 1 до 365 (или от 0 до 364) или должны разбиваться однозначно по модулю 365. (IЯ игнорирую случай високосных лет на данный момент).

Таким образом, объединение "ddmm" может быть уникальным 4-значным числом.Но модуль 365, вероятно, не будет уникальным.

Ответы [ 6 ]

3 голосов
/ 12 января 2011

Итак, вы в основном хотите получить день года?Это не то же самое, что «уникальный int от даты».

Используйте Calendar#get(Calendar.DAY_OF_YEAR) (который основан на 1).

Date date = getItSomehow();
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
int dayOfYear = calendar.get(Calendar.DAY_OF_YEAR);

Как вы уже признали, сравнение этого значения в високосные / не високосные годы не удастся.

1 голос
/ 12 января 2011

Используйте количество дней с начала года.

0 голосов
/ 12 января 2011

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

0 голосов
/ 12 января 2011

Обновление: ОП уточнил вопрос, чтобы получить уникальное значение в диапазоне 1-364.В этом случае я бы преобразовал дату в Calendar объект и вызвал бы get (Calendar.DAY_OF_YEAR) на нем - это вернет номер дня в году, который точно соответствует ОП после того, как кажется.

Оригинальный ответ: Существует столько же способов сделать это, сколько есть битов строки.Если вы хотите использовать уникальные числа для относительного сравнения дат, то наиболее очевидным решением является то, что в любом случае делает большинство компьютеров, а именно - преобразование даты в некоторый наименьший общий знаменатель, например, количество секунд в определенной эпохе.Java предоставляет способы сделать это с классами Date и Calendar.Если вы заботитесь только о днях и месяцах, вы можете достичь того же с int v = (month * 120) + day.Если вас не интересуют сравнения и вы просто хотите получить уникальное значение, вы можете создать дайджест даты, используя какой-то алгоритм хеширования.В Java вы можете, например, взять String представление даты и вызвать hashCode() для нее.

0 голосов
/ 12 января 2011

Использовать метку времени Unix, см. java.util.Date.getTime ()

0 голосов
/ 12 января 2011
new Date().getTime()

Количество миллисекунд с 1970 года должно быть уникальным для каждой даты.Просто преобразуйте строку в объект даты и используйте getTime()

  DateFormat formatter = new SimpleDateFormat("dd-MM-yyyy");
  Date date = formatter.format( myInput );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...