首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python日期格式化程序

Python日期格式化程序
EN

Code Review用户
提问于 2018-11-26 10:22:36
回答 2查看 107关注 0票数 2

我想找到最好的方式来格式化日期为YYYY,YYYYMM或YYYYMMDD。

到目前为止,我得到的是:

代码语言:javascript
复制
# gets the position of a character in the format
def get_pos(format, letter, number):
    it_number = 0
    it_pos = 0
    for char in format:
        if char == letter:
            it_number += 1
            if it_number == number:
                return(it_pos)
        it_pos += 1
    return(-1)

# loops through all the characters forming a number
def format_loop(string, old_format, letter):
    new = ''
    pos = -2
    it = 1
    while(pos != -1):
        pos = get_pos(old_format, letter, it)
        if(pos >= 0):
            new += string[pos]
        it += 1
    return(new)

# format a date
def date_format(string, old_format, new_format, delim):
    new = format_loop(string, old_format, 'Y')
    if(new_format in 'MD'):
        new += delim + format_loop(string, old_format, 'M')
    if(new_format == 'D'):
        new += delim + format_loop(string, old_format, 'D')
    return(new)

函数的取用参数依次是要格式化的日期字符串、其当前格式、以“Y”、“M”或“D”形式表示的所需格式,以及在数字之间插入的可选分隔符。

我愿意听取关于缩短和优化代码以及编码风格和变量/函数命名的建议。

EN

回答 2

Code Review用户

回答已采纳

发布于 2018-11-27 11:40:11

在解析和操作日期(或时间)时,应该使用datetime模块。

它同时支持用给定格式解析字符串格式化datetime具有另一种给定格式的。它唯一不支持的是在数字之间添加一个分隔符:

代码语言:javascript
复制
import datetime

def date_format(string, old_format, new_format):
    return datetime.strptime(string, old_format).strftime(new_format)

请注意,格式必须符合datetimeS格式说明符。特别是,这意味着您必须分别使用"YYYY""YYYYMM""YYYYMMDD",而不是"%Y""%Y%m""%Y%m%d"。这些格式说明符不是任意的,它们与相应的C库(已经存在了相当一段时间)所支持的格式说明符非常相似。

所以,除非您真的需要这个分隔符,否则我会使用它,因为它非常简单,而且更容易理解(特别是其他人)。即使需要分隔符,也可能更容易操作此函数的输出来包含它。

票数 1
EN

Code Review用户

发布于 2018-11-26 13:01:49

对于第一个循环,有一个名为enumerate()的简洁的小函数,它允许您遍历一个对象并访问元素和迭代号。

您还可以删除各种括号,用于returned值和while循环(尽管对于大的条件,有时保留括号是很方便的)。

代码语言:javascript
复制
def get_pos(format, letter, number):
    it_number = 0
    # it_pos = 0 <--- not needed anymore because of the
    for it_pos, char in enumerate(format): # <--- enumerate
        if char == letter:
            it_number += 1
            if it_number == number:
                return it_pos
        # it_pos += 1 <--- same thing here
    return -1

对于第二个函数,我建议使用while Truebreak,这样您就不必事先声明pos=-2

代码语言:javascript
复制
def format_loop(string, old_format, letter):
    new = ''
    # pos = -2 <--- replaced by a break
    it = 1
    while True:
        pos = get_pos(old_format, letter, it)
        if pos == -1:
            break
        elif pos >= 0:
            new += string[pos]
        it += 1
    return new

另外,我不知道是否有官方建议,但我喜欢在特殊情况下使用非常显式的返回值,例如字符串"not found"而不是-1。当您阅读if pos=="not found": break时,这使得代码比Python更英文版,我非常喜欢它。

票数 1
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/208436

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档