Skip to main content

Awesome time conversion handling with support for chaining operations.

Project description

1 NbTime 介绍

为什么要写处理时间的包

开发中,关于处理时间转换虽然是一件不值一提很微不足道很小的事情,但也是一个常见的事情。
封装的不好的时间操作工具库,造成每次调用麻烦,
例如要调用不同的函数来处理 时间戳 时间字符串 时间对象之间的转换,
以及烦人的时区的转化,可能从一个时间种类变化到另一个时间类型形态,用户在中间过程要调用三四次不同的函数来转化,
才能处理得到想要的最终结果。

NbTime对象实例化入参接受所有种类的入参,不需要用户针对不同的传参类型做时间转化而选择不同的函数
,用户无脑将任意入参传给NbTime即可;NbTime将常用的时间处理转化结果,作为对象的惰性属性。
一个NbTime的实例化入参搞定所有时间转化需求,不需要用户亲自去选择各种用途的时间转换函数来对时间做转换。

例如像下面图片这种 模块级 + 各种各样的函数 封装的 时间工具包,就太不好用了,因为需要记忆和选择各种各样的不同用途的函数对时间进行转化。

封装时间操作不难,但如果封装的不好用,造成项目中调用它处处难。

那种 一个 time_utils.py 下 def 100 多个时间转换函数的 公共工具包,真的太难用了,用的时候都不知道选用什么函数好。

img_2.png

NbTime 是oop面向对象开发的爽快的日期时间操作类
NbTime 支持无限链式操作来处理时间,
(因为是oop所以易用程度远远的暴击面向过程python工程师写的time_utils.py里面
写几百个独立的操作时间的面向过程函数)

NbTime 入参支持 None 字符串 时间戳 datetime对象 NbTime对象自身
NbTime 支持将任意格式的时间字符串转成时间对象,无需提前精确指定写 yyyyy-mm-dd HHMMSS 这样的模板。
NbTime 非常轻松支持时区转化
Nbtime 内置属性 datetime对象,兼容性好

NbTime操作时间,远远暴击使用datetime和三方arrow包,
远远暴击用户在 utils.time_utils.py文件中写几百个孤立的面向过程操作时间的函数.

1.1 安装

pip install nb_time

2 NbTime 时间值传参用法

NbTime 最方便的地方在于入参可以是任何种类,可以不传参;可以传递数字时间戳,自动识别是否是毫秒时间戳;

可以传递datetime对象;可以传递NbTime类型的对象;

可以传递时间字符串,而且可以自动把任何格式模板的时间字符串自动转化成NbTime对象;

综上所述NbTime入参方式已经囊括了所有可能。

所以用户始终用NbTime就可以了,无需记忆和选择几百个各种各样的时间转换函数。

不管是从 时间戳 时间字符串 datetime对象 以及不同时区 的之间互相转化,都是使用 NbTime 对象作为中转对象。

2.1 NbTime 不传参,就是当前时间

>>> from nb_time import NbTime
>>> NbTime()                   
<NbTime [2024-02-29 17:51:14 +0800]>

2.2 NbTime 传参datetime对象

>>> NbTime(datetime.datetime.now())
<NbTime [2024-02-29 17:56:43 +0800]>

2.3 NbTime 传参时间戳

>>> NbTime(1709192429)
<NbTime [2024-02-29 15:40:29 +0800]>

传了大于13位的毫秒时间戳,也能自动转化。

>>> NbTime(1709192429000)
<NbTime [2024-02-29 15:40:29 +0800]>

2.4 NbTime 传参字符串,可以对字符串设置时区,例如把东七区的时间字符串转化成东8区的格式.

>>> NbTime('2024-02-26 15:58:21',datetime_formatter=NbTime.FORMATTER_DATETIME,time_zone=NbTime.TIMEZONE_EASTERN_7).to_tz('UTC+8')
<NbTime [2024-02-26 16:58:21 +0800]>

2.4.b Nbtime 万能自动识别时间字符串模板,可以将所有常见的时间字符串转换成时间对象

Nbtime 万能自动识别时间字符串模板,可以将所有常见的时间字符串转换成时间对象,不需要提前精确的写 yyyy-mm-dd 这样的。

以下例子都能直接转化成时间对象,无视时间字符串格式。

from nb_time import NbTime
print(NbTime('20230506T010203.886 +08:00'))
print(NbTime('2023-05-06 01:02:03.886'))
print(NbTime('2023-05-06T01:02:03.886 +08:00'))
print(NbTime('20221206 1:2:3'))
print(NbTime('Fri Jul 19 06:38:27 2024'))
print(NbTime('2013-05-05 12:30:45 America/Chicago'))

2.5 NbTime 传参 DateTimeValue类型对象

>>> from nb_time import DateTimeValue
>>> NbTime(DateTimeValue(year=2022,month=5,day=9,hour=6),time_zone='UTC+7')
<NbTime [2022-05-09 06:00:00 +0700]>

2.6 NbTime传参 NbTime对象

NbTime入参本身支持无限嵌套NbTime对象

NbTime(NbTime(NbTime(NbTime())))
<NbTime [2024-02-29 18:39:09]>


为什么 NbTime支持入参是自身类型,例如你可以方便的转时区和转字符串格式化
例如0时区的2024-02-29 07:40:34,你要转化成8时区的带毫秒带时区的时间字符串,
>>> from nb_time import NbTime                                                                                                    
>>> NbTime(NbTime('2024-02-29 07:40:34', time_zone='UTC+0', datetime_formatter=NbTime.FORMATTER_DATETIME_NO_ZONE),
...                time_zone='UTC+8', datetime_formatter=NbTime.FORMATTER_MILLISECOND).datetime_str
'2024-02-29 15:40:34.000000 +0800'

3 NbTime 链式计算时间

NbTime().shift方法返回的对象仍然是Nbtime类型。 因为Nbtime对象本身具有很多好用的属性和方法,所以使用NbTime作为时间转化的中转对象,比使用datetime作为中转对象方便使用很多。

求3天1小时10分钟后的时间,入参支持正数和负数

>>> NbTime().shift(hours=1,minutes=10).shift(days=3)
<NbTime [2024-03-03 19:02:49 +0800]>

求当前时间1天之前的时间戳

>>> NbTime().shift(days=-1).timestamp
1709290123.409756

3 NbTime 时区设置

3.1 NbTime 实例化时候设置时区

实例化时候分别设置东7区和0时区

>>> NbTime(time_zone='UTC+7')
<NbTime [2024-02-29 17:05:08 +0700]>
>>> NbTime(time_zone='UTC+0') 
<NbTime [2024-02-29 10:05:08 +0000]>

3.2 全局设置时区

用户不传递时区时候,默认就是操作系统时区,如果用户想统一设置时区

例如用户统一设置东8区,以后实例化就不用每次亲自传递东八区.

NbTime.set_default_time_zone('UTC+8')

4 设置时间字符串格式化

4.1 NBTime实例化时候设置时间字符串格式

用户不想要毫秒时间字符串

>>> NbTime(datetime_formatter=NbTime.FORMATTER_DATETIME)    
<NbTime [2024-02-29 18:10:57 +0800]>

用户不想要字符串带时区

>>> NbTime(datetime_formatter=NbTime.FORMATTER_DATETIME_NO_ZONE) 
<NbTime [2024-02-29 18:12:18]>

4.2 NBTime全局设置字符串格式

NbTime.set_default_formatter 可以全局设置时间格式字符串,就不需要每次都传递格式

>>> NbTime.set_default_formatter(NbTime.FORMATTER_DATETIME_NO_ZONE)
>>> NbTime()
<NbTime [2024-02-29 18:14:38]>

5 NbTime 对象内置的成员属性

见下面的交互,NbTime类型对象有非常便捷的各种成员变量,

datetime  类型datetime.datetime类型的时间对象,这个很方便和内置类型关联起来
time_zone_obj 时区
datetime_str 日期时间字符串
time_str 时间字符串
date_str 日期字符串
timestamp  时间戳秒
timestamp_millisecond 时间戳毫秒
today_zero_timestamp 当天凌晨的时间戳
>>> nbt=NbTime()
>>> nbt.datetime
datetime.datetime(2024, 2, 29, 18, 16, 23, 541415, tzinfo=<DstTzInfo 'Asia/Shanghai' CST+8:00:00 STD>)

>>> nbt.time_zone_obj
<DstTzInfo 'Asia/Shanghai' LMT+8:06:00 STD>

>>> nbt.datetime_str
'2024-02-29 18:16:23'

>>> nbt.time_str
'18:16:23'

>>> nbt.date_str
'2024-02-29'

>>> nbt.timestamp
1709201783.541415

>>> nbt.timestamp_millisecond
1709201783541.415

>>> nbt.today_zero_timestamp
1709136000

6 NbTime的方法

6.1 get_str 方法转化成任意字符串格式

例如获取今天的年月日,中间不要带 - 
>>> NbTime().get_str('%Y%m%d')
20240301

6.2 shift 是计算生成新的NbTime对象,支持无限连续链式操作

求3天1小时10分钟后的时间,入参支持正数和负数
>>> NbTime().shift(hours=1,minutes=10).shift(days=3)
<NbTime [2024-03-03 19:02:49 +0800]>

6.3 to_tz 是生成新的时区的NbTime对象,把NbTime对象转化成另一个时区.

一个东7区的时间:
>>> NbTime('2024-02-26 15:58:21',datetime_formatter=NbTime.FORMATTER_DATETIME,time_zone=NbTime.TIMEZONE_EASTERN_7)
<NbTime [2024-02-26 15:58:21 +0700]>

那这个东7区的时间转化成东8区的时间:
>>> NbTime('2024-02-26 15:58:21',datetime_formatter=NbTime.FORMATTER_DATETIME,time_zone=NbTime.TIMEZONE_EASTERN_7).to_tz('UTC+8')
<NbTime [2024-02-26 16:58:21 +0800]>

6.3.2 两种时区转化写法

例如东7区的2024-02-29 07:40:34转成东八区的时间字符串。

from nb_time import  NbTime

# NbTime对象无限嵌套传参给NbTime方式
print(NbTime(NbTime('2024-02-29 07:40:34', time_zone='UTC+7'), time_zone='UTC+8').datetime_str)

# to_tz 方式
print(NbTime('2024-02-29 07:40:34', time_zone='UTC+7').to_tz('UTC+8').datetime_str)

6.4 NbTime 对象 支持 > < = 比较

NbTime 实现了 __gt__  __lt__  __eq__ 方法,可以直接比较大小

>>> NbTime() > NbTime('2023-05-06 01:01:01')                                            
True
>>> NbTime() > NbTime('2025-05-06 01:01:01') 
False

7.用户自定义继承 NbTime 类

因为 nb_time 是 oop面向对象开发的,所以可以继承, 如果是面向过程编程,使用模块级 + 函数的方式来编程,先改变模块的某个全局变量或者函数逻辑,只能使用猴子补丁技术,而且模块天然还是个单例,不适合多次猴子补丁 面向对象就是有优势.

7.1 例如用户想使用 UTC 0时区,但是不想频繁传递 时区入参,可以使用 nb_time的 自带的UtcNbTime 类,或者用户手写这个类自己继承NbTime

class UtcNbTime(NbTime):
    default_time_zone = NbTime.TIMEZONE_UTC

# 使用的时候
UtcNbTime()   

7.2 例如 用户想使用上海时区,并且默认使用不带时区的时间字符串格式化

class ShanghaiNbTime(NbTime):
    default_time_zone = NbTime.TIMEZONE_ASIA_SHANGHAI
    default_formatter = NbTime.FORMATTER_DATETIME_NO_ZONE

# 使用的时候
ShanghaiNbTime()  

7.3 数据分析,常用的时间也可以加上来

class PopularNbTime(NbTime):
    @property
    def ago_1_days(self):
        return self.shift(days=-1)

    @property
    def ago_7_days(self):
        return self.shift(days=-7)

    @property
    def ago_30_days(self):
        return self.shift(days=-30)

    @property
    def ago_180_days(self):
        return self.shift(days=-180)

8 NbTime总结

总结就是 NbTime 的入参接受所有类型,NbTime支持链式调用,Nbtime方便支持时区,Nbtime方便操作时间转化,
所以NbTime操作时间,远远暴击使用datetime和三方arrow包,
远远暴击用户在 utils.time_utils.py文件中写几百个孤立的面向过程操作时间的函数.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

nb_time-2.3.tar.gz (14.0 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

nb_time-2.3-py3-none-any.whl (10.6 kB view details)

Uploaded Python 3

File details

Details for the file nb_time-2.3.tar.gz.

File metadata

  • Download URL: nb_time-2.3.tar.gz
  • Upload date:
  • Size: 14.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.7.9

File hashes

Hashes for nb_time-2.3.tar.gz
Algorithm Hash digest
SHA256 7c61bab7aa35bc29232fcb94f0122e721290ea9f9304df10a3f59a1ebc7dd0a5
MD5 1c4e5f72248c3a9ee658e698d5f456b5
BLAKE2b-256 742807e5ee74b961e30cc760483ee7233de4f37603fd78801d3592355e13e8e5

See more details on using hashes here.

File details

Details for the file nb_time-2.3-py3-none-any.whl.

File metadata

  • Download URL: nb_time-2.3-py3-none-any.whl
  • Upload date:
  • Size: 10.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.7.9

File hashes

Hashes for nb_time-2.3-py3-none-any.whl
Algorithm Hash digest
SHA256 b1047bab4a482dd384c2614c559580d26d07ac20d4a4e099b8c9688f51b4d4c2
MD5 dd3d213acd76c79c27c1e70f73cc4603
BLAKE2b-256 5b3181a3b30e6ea0cd2e3b5fc6231494d2c917516fc5b4c54161c2d84cd41bf9

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page