Я решил это, поставив runOnUiThread( new Runnable(){ ..
внутри run()
:
thread = new Thread(){
@Override
public void run() {
try {
synchronized (this) {
wait(5000);
runOnUiThread(new Runnable() {
@Override
public void run() {
dbloadingInfo.setVisibility(View.VISIBLE);
bar.setVisibility(View.INVISIBLE);
loadingText.setVisibility(View.INVISIBLE);
}
});
}
} catch (InterruptedException e) {
e.printStackTrace();
}
Intent mainActivity = new Intent(getApplicationContext(),MainActivity.class);
startActivity(mainActivity);
};
};
thread.start();
Для объектов timedelta
нет встроенного форматирования, но сделать это очень легко:
days, seconds = duration.days, duration.seconds
hours = days * 24 + seconds // 3600
minutes = (seconds % 3600) // 60
seconds = seconds % 60
Или, что то же самое, если вы находитесь в Python версии 2.7 или 3.2+:
seconds = duration.total_seconds()
hours = seconds // 3600
minutes = (seconds % 3600) // 60
seconds = seconds % 60
Теперь вы можете распечатать его, но вы хотите:
'{} minutes, {} hours'.format(minutes, hours)
Например:
def convert_timedelta(duration):
days, seconds = duration.days, duration.seconds
hours = days * 24 + seconds // 3600
minutes = (seconds % 3600) // 60
seconds = (seconds % 60)
return hours, minutes, seconds
td = datetime.timedelta(2, 7743, 12345)
hours, minutes, seconds = convert_timedelta(td)
print '{} minutes, {} hours'.format(minutes, hours)
Это напечатает:
9 minutes, 50 hours
Если вы хотите получить «10 минут, 1 час» вместо «10 минут, 1 час», вам тоже нужно сделать это вручную:
print '{} minute{}, {} hour{}'.format(minutes, 's' if minutes != 1 else '',
hours, 's' if minutes != 1 else '')
Или вы можете захотеть написать функцию english_plural
для выполнения бит 's'
для вас, вместо того, чтобы повторять себя.
Из ваших комментариев это звучит так, будто вы действительно хотите, чтобы дни были раздельными. Это еще проще:
def convert_timedelta(duration):
days, seconds = duration.days, duration.seconds
hours = seconds // 3600
minutes = (seconds % 3600) // 60
seconds = (seconds % 60)
return days, hours, minutes, seconds
Если вы хотите преобразовать это значение в одно значение для хранения в базе данных, затем преобразуйте это единственное значение обратно для его форматирования, сделайте следующее:
def dhms_to_seconds(days, hours, minutes, seconds):
return (((days * 24) + hours) * 60 + minutes) * 60 + seconds
def seconds_to_dhms(seconds):
days = seconds // (3600 * 24)
hours = (seconds // 3600) % 24
minutes = (seconds // 60) % 60
seconds = seconds % 60
return days, hours, minutes, seconds
Итак, соединяя его:
def store_timedelta_in_database(thingy, duration):
seconds = dhms_to_seconds(*convert_timedelta(duration))
db.execute('INSERT INTO foo (thingy, duration) VALUES (?, ?)',
thingy, seconds)
db.commit()
def print_timedelta_from_database(thingy):
cur = db.execute('SELECT duration FROM foo WHERE thingy = ?', thingy)
seconds = int(cur.fetchone()[0])
days, hours, minutes, seconds = seconds_to_dhms(seconds)
print '{} took {} minutes, {} hours, {} days'.format(thingy, minutes, hours, days)
A datetime.timedelta
соответствует разнице между двумя датами, а не самой датой. Это выражается только в днях, секундах и микросекундах, так как более крупные единицы времени, такие как месяцы и годы, не разлагаются чисто (это 30 дней 1 месяц или 0,9677 месяца?).
Если вы хотите конвертировать a timedelta
в часы и минуты, вы можете использовать метод total_seconds()
, чтобы получить общее количество секунд, а затем выполнить некоторую математику:
x = datetime.timedelta(1, 5, 41038) # Interval of 1 day and 5.41038 seconds
secs = x.total_seconds()
hours = int(secs / 3600)
minutes = int(secs / 60) % 60
Просто используйте strftime :)
Что-то вроде этого:
my_date = datetime.datetime(2013, 1, 7, 10, 31, 34, 243366, tzinfo=<UTC>)
print(my_date.strftime("%Y, %d %B"))
После редактирования вашего вопроса в формате timedelta
вы может использовать:
def timedelta_tuple(timedelta_object):
return timedelta_object.days, timedelta_object.seconds//3600, (timedelta_object.seconds//60)%60
Вы хотите напечатать дату в этом формате? Это документ python: http://docs.python.org/2/library/datetime.html#strftime-strptime-behavior
>>> a = datetime.datetime(2013, 1, 7, 10, 31, 34, 243366)
>>> print a.strftime('%Y %d %B, %M:%S%p')
>>> 2013 07 January, 31:34AM
Для timedelta:
>>> a = datetime.timedelta(0,5,41038)
>>> print '%s seconds, %s microseconds' % (a.seconds, a.microseconds)
Но обратите внимание, что вы должны убедиться, что оно имеет соответствующее значение. Для вышеупомянутых случаев у него нет часов и минут, вы должны рассчитывать с секунд.
Я определил собственную вспомогательную функцию для преобразования объекта timedelta в формат «HH: MM: SS» - только часы, минуты и секунды, не меняя часы на несколько дней.
def format_timedelta(td):
hours, remainder = divmod(td.total_seconds(), 3600)
minutes, seconds = divmod(remainder, 60)
hours, minutes, seconds = int(hours), int(minutes), int(seconds)
if hours < 10:
hours = '0%s' % int(hours)
if minutes < 10:
minutes = '0%s' % minutes
if seconds < 10:
seconds = '0%s' % seconds
return '%s:%s:%s' % (hours, minutes, seconds)
datetime.timedelta(hours=1, minutes=10)
#python 2.7
Нет необходимости в пользовательских вспомогательных функциях, если нам нужно всего лишь напечатать строку формы [D day[s], ][H]H:MM:SS[.UUUUUU]
. Объект timedelta поддерживает операцию str()
, которая будет делать это. Он работает даже в Python 2.6.
>>> from datetime import timedelta
>>> timedelta(seconds=90136)
datetime.timedelta(1, 3736)
>>> str(timedelta(seconds=90136))
'1 day, 1:02:16'