【问题标题】:using datetime object as an argument使用日期时间对象作为参数
【发布时间】:2013-05-25 19:43:29
【问题描述】:

我一直在努力理解如何使用日期时间对象。我想使用 datetime.date 实例作为字典中的键。然后我希望能够使用 datetime.delta 返回指定范围内的日期。

我的第一个难题是当我创建要输入字典的对象时。

class Work_day():
    '''input a workday , date and hours worked'''

    def __init__(self, date, hours, rate):
        self.date = datetime.date() 
        self.hours = hours
        self.rate = rate

我希望 self.date 成为 datetime.date 对象,但 datetime.date 需要 3 个参数(年、月、日),那么 def_init_ 参数“日期”的正确语法是什么'?

然后我假设当我更改在 Work_day 类中的编写方式时,当我在 Timesheet 类中创建它的实例时,我将不得不修改我的代码,例如在 add_work_day() 方法中

class Timesheet():
    '''Represent a collection of workdays'''

    def __init__(self):
        self.timesheet = {}

    def add_work_day(self, date, hours,rate):
        '''adds a record of a work day into the timesheet dictionary'''

        day = Work_day(date, hours, rate)
        if day.date in self.timesheet:
            print("There is already an entry for this day. ")

        else:
            self.timesheet[day.date] = hours, rate

我一直在研究 python 文档和搜索书籍,但我没有得到它!需要一些帮助。

我还有一种方法可以在时间表中打印一系列工作日。当我将日期键替换为简单的 int 时,我让它工作了。在这里(在 ''' ''' 中)在下面的日期时间增量中进行了一次糟糕的尝试

def show_days(self):
    '''shows a user defined range of dates and the total pay for that period'''
    pp = pprint.PrettyPrinter()
    date_from = input("From date: ")
    date_to = input("To date: ")
    t = self.timesheet
    total = 0

    '''for dates in range(date_from, date_to + 1):
        if dates in t:
            total += self.sum_day(dates)
            pp.pprint((dates, t[dates)])
    print("Total £", total)'''

    date = date_start = datetime.date(date_from)
    date_end = datetime.date(date_to)

    while date <= date_end:
        if date in t:
            print(date, t[dates])
        date += datetime.timedelta(days=1)

我希望有人能耐心地告诉我这个问题。干杯。

【问题讨论】:

  • 使用时间戳作为键。这样会更容易
  • 这不是给我当前时间/日期吗?我需要能够输入任何日期。
  • 您可以获取一天开始的时间戳

标签: class datetime python-3.x arguments timedelta


【解决方案1】:

如果您使用self.date = datetime.date(*date) 分配日期,那么您可以通过传递(年、月、日)元组来创建Work_day

day = Work_day((2013,5,31), 8.0, 8.25)

或者,如果您希望输入为日期字符串,请使用datetime.strptime、适当的格式化字符串和date() 方法来获取date 对象:

self.date = datetime.datetime.strptime(date,'%m/%d/%Y').date()
...
date = Work_day('5/31/2013', 8.0, 8.25)

最后,你可以只传递一个日期对象:

day = Work_day(datetime.date(2013,5,31), 8.0, 8.25)
...
self.date = date

Timesheet 类应该在任何这些更改之后工作。 show_days 仍然需要一些工作,但我将把它留作练习。提示:使用strptime 解析输入日期。

【讨论】:

    猜你喜欢
    • 2021-03-21
    • 2023-04-06
    • 2019-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-19
    • 1970-01-01
    相关资源
    最近更新 更多