Python 将分数天数转换为H:M:S.MS-两个示例 两种计算局部时间的方法,你认为最好的方法是什么?为什么?

Python 将分数天数转换为H:M:S.MS-两个示例 两种计算局部时间的方法,你认为最好的方法是什么?为什么?,python,datetime,Python,Datetime,编辑:“分数日”在这里是指儒略日的小数部分jd:jd-(数学地板(jd-0.5)+0.5)(这是因为0:00:00在jd.5) @classmethod 来自分数的def(cls,分数,**kwargs): 更改=错误 f=λx:十进制十二月(楼层(x)) 如果不存在(分形、十进制、十进制): 分形=十进制12月(分形) 小时=十进制12月(D24*(分形-f(分形))) 如果小时数小于1: 小时+=1#或微秒无法正确计算 更改=真 分钟=十进制12月(D60*(小时-f(小时))) 秒=十进制

编辑:“分数日”在这里是指儒略日的小数部分jd:
jd-(数学地板(jd-0.5)+0.5)
(这是因为0:00:00在jd.5)

@classmethod
来自分数的def(cls,分数,**kwargs):
更改=错误
f=λx:十进制十二月(楼层(x))
如果不存在(分形、十进制、十进制):
分形=十进制12月(分形)
小时=十进制12月(D24*(分形-f(分形)))
如果小时数小于1:
小时+=1#或微秒无法正确计算
更改=真
分钟=十进制12月(D60*(小时-f(小时)))
秒=十进制12月(D60*(分钟-f(分钟)))
ms=十进制小数点(DKS*(秒-f(秒)))
如有更改:
小时数-=1
返回整数(小时)、整数(分钟)、整数(秒)、整数(毫秒)
@类方法
来自分馏L2(cls,x)的def:
d=lambda x:decimal.decimal(str(x))
总计=d(x)*d(86400000000000)
小时数=(总计-(总计%d(3600000000000))/d(3600000000000)
总计=总计%d(3600000000000)
分钟数=(总计-(总计%d(600000000000))/d(600000000000)
总计=总计%d(6000000000)
秒=(总计-(总计%d(100000000))/d(100000000)
总计=总计%d(100000000)
ms=(总计-(总计%d(1000000))/d(1000000)
总计=总计%d(1000000)
mics=(总计-(总计%d(1000))/d(1000)
返回整数(小时)、整数(分钟)、整数(秒)、整数(毫秒)
D24=十进制。十进制('24')
DMS=decimal.decimal('86400000.0')
D60=十进制。十进制('60')
D3600=十进制。十进制('3600')
D1440=十进制。十进制('1400')
DKS=decimal.decimal('1000')
DTS=decimal.decimal('86400')

我认为您正试图从以下方面获得帮助:

1.2256 days
致:

但也有微秒

下面是我如何生成上述响应的:

def nice_repr(timedelta, display="long"):
    """
    Turns a datetime.timedelta object into a nice string repr.

    display can be "minimal", "short" or "long" [default].

    >>> from datetime import timedelta as td
    >>> nice_repr(td(days=1, hours=2, minutes=3, seconds=4))
    '1 day, 2 hours, 3 minutes, 4 seconds'
    >>> nice_repr(td(days=1, seconds=1), "minimal")
    '1d, 1s'
    """

    assert isinstance(timedelta, datetime.timedelta), "First argument must be a timedelta."

    result = ""

    weeks = timedelta.days / 7
    days = timedelta.days % 7
    hours = timedelta.seconds / 3600
    minutes = (timedelta.seconds % 3600) / 60
    seconds = timedelta.seconds % 60

    if display == 'minimal':
        words = ["w", "d", "h", "m", "s"]
    elif display == 'short':
        words = [" wks", " days", " hrs", " min", " sec"]
    else:
        words = [" weeks", " days", " hours", " minutes", " seconds"]

    values = [weeks, days, hours, minutes, seconds]

    for i in range(len(values)):
        if values[i]:
            if values[i] == 1 and len(words[i]) > 1:
                result += "%i%s, " % (values[i], words[i].rstrip('s'))
            else:
                result += "%i%s, " % (values[i], words[i])

    return result[:-2]

为什么是D60?我想整数被隐式转换成十进制。是的,这可能有些过分了。你说的“分数日”是什么意思?几分之一天?
datetime.timedelta(days=1.75)
有什么问题吗?请参阅我所做的编辑,以获得澄清,但是,对于分数日,即儒略日的小数部分,我会进行说明。不过,我会将您的代码添加到书签中,以供以后使用;)(顺便说一句,它还向我展示了如何在实践中使用assert语句)
1 day, 5 hours, 24 minutes, 51 seconds
def nice_repr(timedelta, display="long"):
    """
    Turns a datetime.timedelta object into a nice string repr.

    display can be "minimal", "short" or "long" [default].

    >>> from datetime import timedelta as td
    >>> nice_repr(td(days=1, hours=2, minutes=3, seconds=4))
    '1 day, 2 hours, 3 minutes, 4 seconds'
    >>> nice_repr(td(days=1, seconds=1), "minimal")
    '1d, 1s'
    """

    assert isinstance(timedelta, datetime.timedelta), "First argument must be a timedelta."

    result = ""

    weeks = timedelta.days / 7
    days = timedelta.days % 7
    hours = timedelta.seconds / 3600
    minutes = (timedelta.seconds % 3600) / 60
    seconds = timedelta.seconds % 60

    if display == 'minimal':
        words = ["w", "d", "h", "m", "s"]
    elif display == 'short':
        words = [" wks", " days", " hrs", " min", " sec"]
    else:
        words = [" weeks", " days", " hours", " minutes", " seconds"]

    values = [weeks, days, hours, minutes, seconds]

    for i in range(len(values)):
        if values[i]:
            if values[i] == 1 and len(words[i]) > 1:
                result += "%i%s, " % (values[i], words[i].rstrip('s'))
            else:
                result += "%i%s, " % (values[i], words[i])

    return result[:-2]