2014-05-30 3 views
0

Я создаю небольшое приложение для Android, в котором пользователь выбирает время запуска для некоторой операции.java - как провести время?

Я использую TimerPickerDialog:

mTimePicker = new TimePickerDialog(getContext(), new TimePickerDialog.OnTimeSetListener() { 
    @Override 
    public void onTimeSet(TimePicker timePicker, int selectedHour, int selectedMinute) { 
     startTimeHours = selectedHour; 
     startTimeMinutes = selectedMinute; 
}, hour, minute, is24hours); 

и при выборе времени он возвращает Int в течение часа и ИНТ за минуты, которые я сохранить в качестве глобальной переменной.

позже в моем приложении Я хочу преобразовать эти числа в объект Time, который затем я могу использовать, чтобы узнать, больше или меньше текущего времени, чем время, представленное в этом классе.

, что я сделал это:

Time tStart = new Time(startTimeHours, startTimeMinutes, 0); 

но Eclips говорит, что этот конструктор является устаревшим. однако конструктор, который занимает много времени, не выглядит устаревшим.

Я огляделся и в одном посте кто-то рекомендовал использовать объект «Календарь», но я не мог понять, как получить новый экземпляр и установить время. это выглядит как накладные расходы, просто содержащие время.

Какова наилучшая практика для такого сценария? если мне нужно использовать конструктор, который принимает длинную переменную - как мне преобразовать 2 целых числа в это длинное значение?

+0

Умножение, плюс смещение за эпоху. Почему вы не можете использовать длинный, хотя? –

+0

Этот класс 'Time' является классом утилиты из SQL. это, вероятно, не то, что вы хотите использовать. – njzk2

ответ

1

EDIT2:

Это, как вы бы создать два Date объектов с различными временами и сравнить их потом:

Calendar calendar = Calendar.getInstance(); // By default the date and time is set to now 

// Create first date 
calendar.set(Calendar.HOUR_OF_DAY, 20); 
calendar.set(Calendar.MINUTE, 5); 
Date dateOne = calendar.getTime(); 

// Create second date 
calendar.set(Calendar.HOUR_OF_DAY, 17); 
calendar.set(Calendar.MINUTE, 36); 
Date dateTwo = calendar.getTime(); 

// With before() you can check if a Date is before some other date 
if(dateOne.before(dateTwo)) { 
    // dateOne is before dateTwo 
} else { 
    // dateTwo is before dateOne 
} 

Вы также можете использовать after(), чтобы проверить некоторые Date после какой-то другой Date.


EDIT:

Это Long значение вы говорите в последнем абзаце Вашего вопроса эпохи время в миллисекундах. Вы действительно не должны использовать этот класс Time из фреймворка. Я думаю, вы имеете в виду this one? Вы должны использовать решение, которое я разместил ниже.


оригинальный ответ:

я в основном, как правило, используют Date объекты в качестве контейнеров. И наилучшей практикой создания экземпляров Date является использование объекта Calendar. Попробуйте что-то вроде этого:

// We get a Calendar instance with getInstance(); 
Calendar calendar = Calendar.getInstance(); 

// Now we set the date we want. 
calendar.set(Calendar.YEAR, 2014); 
calendar.set(Calendar.MONTH, 4); // Be carefull, months start at 0. January = 0, Feburary = 1, March = 2,... 
calendar.set(Calendar.DAY_OF_MONTH, 29); 
calendar.set(Calendar.HOUR_OF_DAY, 20); 
calendar.set(Calendar.MINUTE, 5); 

// And finally we create the `Date` instance with getTime() 
Date date = calendar.getTime(); 

// You can also do the reverse and set the time in a `Calendar` instance from a `Date` instance. 
calendar.setTime(date); 

Это довольно простой и Calendar является довольно мощным, но я не думаю, что это подходит для вас. Потому что это решение создает объект Date. Таким образом, он хранит гораздо больше, чем часы и минуты.

Вы должны решить, применимо ли это к вашей ситуации.Если вы действительно просто хотите сохранить часы и минуты, я предлагаю вам создать собственный Time класс как это:

public class Time { 

    private int minute; 
    private int hour; 

    public int getMinute() { 
     return minute; 
    } 

    public void setMinute(int minute) { 
     this.minute = minute; 
    } 

    public int getHour() { 
     return hour; 
    } 

    public void setHour(int hour) { 
     this.hour = hour; 
    } 
} 

При необходимости вы можете добавить проверку и расчеты к этому Time класса, но опять же это все зависит от того, что хочет сделать to.

Мы можем дать более точный ответ. Если вы дадите нам больше информации о том, какие значения времени вам нужно хранить, точнее, если необходимо сохранить любую информацию о дате?

+0

Что мне нужно сделать в моем приложении, это взять текущее время и проверить, что оно больше или меньше или равно времени, выбранному пользователем. Как я могу сделать такое сравнение? – developer82

+0

Предполагаю, вы имеете в виду только сравнение разных времен в тот же день? Я отредактирую свой ответ. –

+0

Да - вот что я имею в виду. – developer82

0

Вместо того, чтобы тратить время на создание классов, которые имеют ограниченное использование, например объект времени, который действительно не имеет никакого значения, кроме как в контексте содержащейся даты, сосредоточьтесь на том, чтобы облегчить управление Датами.

Использование заданных методов в календаре - серьезное перетаскивание, и это уродливо. Из-за этого материал Дата/Время взорвался в Java 8.

То есть, я получил вид надоел некоторое время назад и сделал DateBuilder, который использует свободно шаблон проектирования строителя, чтобы позволить вам легко построить даты, используя такой подход, как это:

Date newDate = new DateBuilder().hour(10).minute(20).build(); 

В конце концов я добавил куча других удобств, которые являются неприятностью, например, давая мне полночь или позволяя мне просто добавить время. То, что действительно засасывает то, как Даты работают на Java, заключается в том, что вы обнаруживаете, что пишете много кода, это уродливо, и это значительно снижает читаемость окружающего кода. Строитель разделяет это.

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

new DateBuilder(new Date()).addDays(3).build(); 

Я играл с новой датой вещи в 8, и это лучше. Джойда тоже приятна, но самое смешное, в конечном итоге, мне не очень понравилось Джоде, потому что, хотя это было лучше, это просто привнесло некоторые из тех же вещей в код, и это провалило один из самых важных тестов в библиотеке, которую вы Примите: мне все время приходилось возвращаться и читать документы каждый раз, когда я их использовал. Использование категорий в Objective-C убеждало меня в том, что часто лучше всего создавать верхний слой кода, который вы будете касаться себя, отчасти потому, что вы, скорее всего, сделаете что-то, что вы будете использовать текучим (отсюда и название), но также потому, что это квази-DSL: если я буду программировать в другом домене, мне может понадобиться другой DateBuilder, который подчеркивал бы другие вещи.

+0

Вы когда-нибудь публиковали DateBuilder? – developer82

+0

Да, это моя учетная запись github как сущность [здесь] (https://gist.github.com/codeslubber/5613222). – Rob

Смежные вопросы