Конвертировать целочисленные даты / время в метку времени Unix в Java? - PullRequest
4 голосов
/ 13 января 2011

Это в основном относится к Android, но может быть использовано в Java.У меня есть эти слушатели:

int year, month, day, hour, minute;
// the callback received when the user "sets" the date in the dialog
private DatePickerDialog.OnDateSetListener mDateSetListener =
        new DatePickerDialog.OnDateSetListener() {

            public void onDateSet(DatePicker view, int year, 
                                  int monthOfYear, int dayOfMonth) {
                year = year;
                month = monthOfYear;
                day = dayOfMonth;
            }
        };
// the callback received when the user "sets" the time in the dialog
private TimePickerDialog.OnTimeSetListener mTimeSetListener =
    new TimePickerDialog.OnTimeSetListener() {
        public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
            hour = hourOfDay;
            minute = minute;
        }
    };

Как я могу преобразовать int year, month, day, hour, minute; в метку времени Unix?Возможно ли это без класса Date?

Ответы [ 3 ]

19 голосов
/ 13 января 2011

Хорошо, тогда используйте Календарь, поскольку в любом случае предпочтительнее Дата:

int componentTimeToTimestamp(int year, int month, int day, int hour, int minute) {

    Calendar c = Calendar.getInstance();
    c.set(Calendar.YEAR, year);
    c.set(Calendar.MONTH, month);
    c.set(Calendar.DAY_OF_MONTH, day);
    c.set(Calendar.HOUR, hour);
    c.set(Calendar.MINUTE, minute);
    c.set(Calendar.SECOND, 0);
    c.set(Calendar.MILLISECOND, 0);

    return (int) (c.getTimeInMillis() / 1000L);
}

Календарь не будет выполнять никаких вычислений до тех пор, пока не будет вызван getTimeMillis(), и он разработан, чтобы быть более эффективным, чем Date.

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

Я предполагаю, что вы хотите избежать накладных расходов на объекты, поэтому я не предлагаю никаких классов Date или Calendar; скорее, вы можете рассчитать значение напрямую.

Время Unix, или время POSIX, представляет собой систему для описания моментов времени, определяемых как количество секунд, прошедших с полуночного координированного универсального времени (UTC) 1 января 1970 года, без учета високосных секунд. ( статья в Википедии )

Рассчитайте количество дней с 1 января 1970 года до выбранного года / месяца / дня и умножьте его на 24 * 3600, затем добавьте hour * 3600 + minute * 60, чтобы получить количество секунд с 1970-01-01 00:00 до выбранная дата и время.

Хорошо известны алгоритмы для вычисления дней между датами.

0 голосов
/ 09 июня 2013

Поскольку я хотел учесть также переход на летнее время вместе с местным часовым поясом, поэтому после поиска часов все возможные решения работали для меня следующим образом:

int gmtOffset = TimeZone.getDefault().getRawOffset();
        int dstOffset = TimeZone.getDefault().getDSTSavings();
        long unix_timestamp = (System.currentTimeMillis() + gmtOffset + dstOffset) / 1000;
...