Xin chào, tôi cần một số trợ giúp để hiểu tại sao điều này xảy ra. Tôi có một phương pháp để theo dõi 'thời gian còn lại trong một chương trình sự kiện:Vấn đề thời gian Python bằng các giá trị âm
def get_program_time_budget(self):
return self.estimated_duration-self.get_program_duration()
Tất cả tốt khi ESTIMATED_DURATION> self.get_program_duration() nhưng khi điều này đi theo cách khác mọi thứ trở nên buồn cười.
Kết quả được hiển thị cho người dùng:
Estimated 11 hours Allocated 10 hours 55 minutes Remaining 5 minutes
Khi kết quả đi tiêu cực nó thực hiện điều này:
Estimated 11 hours Allocated 11 hours 5 minutes Remaining -1 day 23 hours 55 minutes
Bất kỳ ý tưởng làm thế nào để có được kết quả -5 phút?
EDIT: Đây là định dạng timedelta (Lưu ý đây là một bộ lọc Django, vì vậy nhận được giá trị timedelta như một str - nhưng nó được lưu giữ như một timedelta):
def format_duration(value):
try:
delim = ':'
toks = value.split(',')
hour = minute = ''
d_string = value.count('day') and toks[0] or ''
h, m, s = d_string and toks[-1].strip().split(delim) or value.split(delim)
try:
hour = int(h)
except:
pass
try:
minute = int(m)
except:
pass
h_string = "%s%s%s" % (hour and hour or '', (hour and ' hour' or ''),(hour and hour > 1 and 's' or '') )
m_string = "%s%s%s" % (minute and minute or '', (minute and ' minute' or ''),(minute and minute > 1 and 's' or ''))
return "%s %s %s" % (d_string, h_string, m_string)
except Exception, e:
logging.error("Error in format_duration -> %s. Duration value=%s" % (e, value))
return ''v
Đây là cách 'timedelta' hoạt động cho các giá trị âm. Kết quả luôn được chuẩn hóa để chỉ giá trị 'ngày' là âm. Bạn có muốn phủ nhận các trường khác nếu giá trị ngày, ví dụ, -5? –
Chúng ta biết cách trừ hai timedeltas. Những gì chúng tôi không biết là mã bạn sử dụng để hiển thị kết quả. Để được tư vấn tốt hơn, hãy tiết lộ. –
Nếu bạn muốn làm việc với các giá trị timedelta âm theo cách thông minh ("-1 phút" chỉ là "-1 phút" và ** không ** "-1 ngày cộng với 23h59"), bạn có thể sử dụng mô-đun 'relativetimedelta' có mặt trong [dateutil] (http://labix.org/python-dateutil). – florisla