跳转到主要内容

设计用于从HTML页面解析日期的日期解析库

项目描述

功能

  • 以语言无关的方式对200多种语言区域中的日期进行通用解析,以及多种格式的日期。

  • 对相对日期进行通用解析,例如: '1分钟前''2周前''3个月,1周和1天前''2天后''明天'

  • 对带有时区缩写或UTC偏移的日期进行通用解析,例如:'2015年8月14日 EST''2013年7月4日 PST''2013年7月21日 10:15 pm +0500'

  • 在较长的文本中进行日期查找。

  • 支持非公历日历系统。请参阅 支持日历

  • 广泛的测试覆盖。

基本用法

最直接的方法是使用 dateparser.parse 函数,该函数封装了模块中的大部分功能。

noindex:

相对日期

>>> parse('1 hour ago')
datetime.datetime(2015, 5, 31, 23, 0)
>>> parse('Il ya 2 heures')  # French (2 hours ago)
datetime.datetime(2015, 5, 31, 22, 0)
>>> parse('1 anno 2 mesi')  # Italian (1 year 2 months)
datetime.datetime(2014, 4, 1, 0, 0)
>>> parse('yaklaşık 23 saat önce')  # Turkish (23 hours ago)
datetime.datetime(2015, 5, 31, 1, 0)
>>> parse('Hace una semana')  # Spanish (a week ago)
datetime.datetime(2015, 5, 25, 0, 0)
>>> parse('2小时前')  # Chinese (2 hours ago)
datetime.datetime(2015, 5, 31, 22, 0)

默认基于语言的日期顺序偏好

>>> # parsing ambiguous date
>>> parse('02-03-2016')  # assumes english language, uses MDY date order
datetime.datetime(2016, 2, 3, 0, 0)
>>> parse('le 02-03-2016')  # detects french, uses DMY date order
datetime.datetime(2016, 3, 2, 0, 0)

有关日期顺序的更多信息,请参阅 settings

时区和UTC偏移

默认情况下,如果日期字符串中有时区,则 dateparser 返回tzaware datetime 对象。否则,它返回一个无知的 datetime 对象。

>>> parse('January 12, 2012 10:00 PM EST')
datetime.datetime(2012, 1, 12, 22, 0, tzinfo=<StaticTzInfo 'EST'>)
>>> parse('January 12, 2012 10:00 PM -0500')
datetime.datetime(2012, 1, 12, 22, 0, tzinfo=<StaticTzInfo 'UTC\-05:00'>)
>>> parse('2 hours ago EST')
datetime.datetime(2017, 3, 10, 15, 55, 39, 579667, tzinfo=<StaticTzInfo 'EST'>)
>>> parse('2 hours ago -0500')
datetime.datetime(2017, 3, 10, 15, 59, 30, 193431, tzinfo=<StaticTzInfo 'UTC\-05:00'>)

如果日期没有时区名称/缩写或偏移量,您可以使用 TIMEZONE 设置指定它。

>>> parse('January 12, 2012 10:00 PM', settings={'TIMEZONE': 'US/Eastern'})
datetime.datetime(2012, 1, 12, 22, 0)
>>> parse('January 12, 2012 10:00 PM', settings={'TIMEZONE': '+0500'})
datetime.datetime(2012, 1, 12, 22, 0)

TIMEZONE 选项可能单独不很有用,因为它仅将给定的时区附加到结果 datetime 对象。但可以在您想要在不同时区之间转换或简单地想要附加给定时区信息的tzaware日期的情况下很有用。

>>> parse('January 12, 2012 10:00 PM', settings={'TIMEZONE': 'US/Eastern', 'RETURN_AS_TIMEZONE_AWARE': True})
datetime.datetime(2012, 1, 12, 22, 0, tzinfo=<DstTzInfo 'US/Eastern' EST-1 day, 19:00:00 STD>)
>>> parse('10:00 am', settings={'TIMEZONE': 'EST', 'TO_TIMEZONE': 'EDT'})
datetime.datetime(2016, 9, 25, 11, 0)

一些转换时区的更多用例。

>>> parse('10:00 am EST', settings={'TO_TIMEZONE': 'EDT'})  # date string has timezone info
datetime.datetime(2017, 3, 12, 11, 0, tzinfo=<StaticTzInfo 'EDT'>)
>>> parse('now EST', settings={'TO_TIMEZONE': 'UTC'})  # relative dates
datetime.datetime(2017, 3, 10, 23, 24, 47, 371823, tzinfo=<StaticTzInfo 'UTC'>)

如果没有时区出现在日期字符串中或在 settings 中定义,您仍然可以返回tzaware datetime。这特别适用于相对日期,当时不确定相对基准时区是什么。

>>> parse('2 minutes ago', settings={'RETURN_AS_TIMEZONE_AWARE': True})
datetime.datetime(2017, 3, 11, 4, 25, 24, 152670, tzinfo=<DstTzInfo 'Asia/Karachi' PKT+5:00:00 STD>)

如果您想使用UTC而不是默认系统本地时区来计算相对日期,可以使用 TIMEZONE 设置。

>>> parse('4 minutes ago', settings={'TIMEZONE': 'UTC'})
datetime.datetime(2017, 3, 10, 23, 27, 59, 647248, tzinfo=<StaticTzInfo 'UTC'>)

有关时区的更多信息,请参阅 settings

不完整的日期

>>> from dateparser import parse
>>> parse('December 2015')  # default behavior
datetime.datetime(2015, 12, 16, 0, 0)
>>> parse('December 2015', settings={'PREFER_DAY_OF_MONTH': 'last'})
datetime.datetime(2015, 12, 31, 0, 0)
>>> parse('December 2015', settings={'PREFER_DAY_OF_MONTH': 'first'})
datetime.datetime(2015, 12, 1, 0, 0)
>>> parse('March')
datetime.datetime(2015, 3, 16, 0, 0)
>>> parse('March', settings={'PREFER_DATES_FROM': 'future'})
datetime.datetime(2016, 3, 16, 0, 0)
>>> # parsing with preference set for 'past'
>>> parse('August', settings={'PREFER_DATES_FROM': 'past'})
datetime.datetime(2015, 8, 15, 0, 0)
>>> import dateparser
>>> dateparser.parse("2015") # default behavior
datetime.datetime(2015, 3, 27, 0, 0)
>>> dateparser.parse("2015", settings={"PREFER_MONTH_OF_YEAR": "last"})
datetime.datetime(2015, 12, 27, 0, 0)
>>> dateparser.parse("2015", settings={"PREFER_MONTH_OF_YEAR": "first"})
datetime.datetime(2015, 1, 27, 0, 0)
>>> dateparser.parse("2015", settings={"PREFER_MONTH_OF_YEAR": "current"})
datetime.datetime(2015, 3, 27, 0, 0)

您还可以通过以下方式将 STRICT_PARSING 标志设置为完全忽略解析不完整的日期

>>> parse('December 2015', settings={'STRICT_PARSING': True})
None

有关处理不完整日期的更多信息,请参阅设置

在较长的文本块中搜索日期

您可以从较长的文本字符串中提取日期。它们以包含日期的文本块和解析后的datetime对象组成的元组列表返回。

noindex:

高级用法

如果您需要更多控制解析的内容,请检查设置部分以及using-datedataparser部分。

依赖项

dateparser在某些方面依赖于以下库

支持的语言和区域设置

您可以通过访问“支持的区域设置”部分来检查支持的区域设置。

支持日历

除了乔治亚日历外,dateparser还支持波斯贾拉利日历希吉拉/伊斯兰日历

要使用它们,您需要通过键入以下内容来安装“calendar”额外组件:

pip install dateparser[calendars]

  • 使用波斯贾拉利日历的示例。有关更多信息,请参阅波斯贾拉利日历

    >>> from dateparser.calendars.jalali import JalaliCalendar
    >>> JalaliCalendar('جمعه سی ام اسفند ۱۳۸۷').get_date()
    DateData(date_obj=datetime.datetime(2009, 3, 20, 0, 0), period='day', locale=None)
    
  • 使用希吉拉/伊斯兰日历的示例。有关更多信息,请参阅希吉拉日历

    >>> from dateparser.calendars.hijri import HijriCalendar
    >>> HijriCalendar('17-01-1437 هـ 08:30 مساءً').get_date()
    DateData(date_obj=datetime.datetime(2015, 10, 30, 20, 30), period='day', locale=None)
    

历史

1.2.0 (2023-11-17)

新功能

  • 新增了PREFER_MONTH_OF_YEAR设置(#1146)

修复

  • 俄语中的绝对年份不再被视为过去的年数(#1129)

清理和内部改进

  • 移除了对datetime.utcnow的使用,该功能已在Python 3.12中弃用(#1179)

  • 对代码库应用了Black格式化(#1158)

  • 首次与OSSFuzz集成(#1198)

  • 扩展了测试用例(#1191)

1.1.8 (2023-03-22)

改进

  • 改进了中文的日期解析(#1148)

  • 改进了捷克语的日期解析(#1151)

  • 按流行度重新排序语言(#1152)

  • 修复了缓存中的内存泄漏(#1140)

  • 添加了对“d units later”的支持(#1154)

  • 将CLDR数据中的修改移动到yaml(#1153)

  • 添加了对通过设置使用时区以获取PREFER_DATES_FROM结果的支撑(#1155)

1.1.7 (2023-02-02)

改进

  • 为阿拉伯语添加了“ago”同义词(#1128)

  • 改进了捷克语的日期解析(#1131)

  • 改进了印度尼西亚语的日期解析(#1134)

1.1.6 (2023-01-12)

改进

  • 修复了将星期一解析为月份的bug(#1121)

  • 防止西班牙句子分割正则表达式中的ReDoS(#1084)

1.1.5 (2022-12-29)

改进

  • 解析了日期、月份和年份的短形式(#1103)

  • 添加了“in 1d”的测试用例(#1104)

  • 更新了languages_info(#1107)

  • 为在Python 3.10之前没有exec_module的zipimporter添加了工作区(#1069)

  • 在午夜稳定测试(#1111)

  • 为法语添加了测试用例(#1110)

清理

  • 删除了requirements-build文件(#1113)

1.1.4 (2022-11-21)

改进

  • 改进了对斯洛伐克语、印度尼西亚语、印地语、德语和日语等语言的支持(#1064、#1094、#986、#1071、#1068)

  • 递归创建模型家目录(#996)

  • 将正则表达式替换替换为简单的字符串替换(#1095)

  • 添加对Python 3.10、3.11的支持(#1096)

  • 删除对Python 3.5、3.6版本的支持(#1097)

1.1.3 (2022-11-03)

新功能

  • 添加对分数单位的支持(#876)

改进

  • 修复了返回的datetime在time+timezone输入和PREFER_DATES_FROM = 'future'时跳过一天的bug(#1002)

  • 修复了输入翻译破坏keep_formatting的bug(#720)

  • 英文:支持“直至日期” (#1005)

  • 英文:支持相对日期中的“之后”和“之前” (#1008)

清理

  • 重新组织内部数据 (#1090)

  • CI 更新 (#1088)

1.1.2 (2022-10-20)

改进

  • 添加了对负时间戳的支持 (#1060)

  • 修复了 Python 版本 >= 3.6 的 PytzUsageWarning (#1062)

  • 添加了对带点和空格的日期的支持 (#1028)

  • 改进了对乌克兰语、克罗地亚语和俄语的支持 (#1072, #1074, #1079, #1082, #1073, #1083)

  • 添加了对一致解析 Unix 时间戳的支持,无论时区如何 (#954)

  • 改进了测试 (#1086)

1.1.1 (2022-03-17)

改进

  • 通过锁定依赖到更早版本修复了正则表达式库的问题 (< 2022.3.15, #1046)。

  • 扩展了对以小写字母开头的俄语日期的支持 (#999)。

  • 允许对语言使用 use_given_order (#997)。

  • 修复了设置部分的链接 (#1018)。

  • 为 Windows 定义了 UTF-8 编码 (#998)。

  • 修复了 CLI 工具中目录创建错误 (#1022)。

1.1.0 (2021-10-04)

新功能

  • 支持基于 langdetectfastText 或自定义实现的语言检测 (参见 #932)

  • 添加了对“由 <时间>”的支持 (参见 #839)

  • 按互联网使用量对默认语言列表进行排序 (参见 #805)

改进

  • 改进了对中文 (#910) 和捷克语 (#977) 的支持

  • 改进了 search_dates (参见 #953)

  • 使先前区域的顺序具有确定性 (参见 #851)

  • 修复了尾随空格的解析问题 (参见 #841)

  • 考虑 RETURN_TIME_AS_PERIOD 用于时间戳时间 (参见 #922)

  • 排除失败的正则表达式版本 (参见 #974)

  • 正在进行多线程支持的工作 (参见 #881, #885)

  • 添加了演示 URL (参见 #883)

质量保证

  • 将管道从 Travis CI 迁移到 Github Actions (参见 #859, #879, #884, #886, #911, #966)

  • 使用版本化的 CLDR 数据 (参见 #825)

  • 添加了一个用于更新支持的语言和区域的脚本文档 (参见 #601)

  • 对 yaml 文件中的“跳过”键进行排序 (参见 #844)

  • 改进测试覆盖率 (参见 #827)

  • 代码清理 (参见 #888, #907, #951, #958, #957)

1.0.0 (2020-10-29)

重大变更

  • 停止支持 Python 2.7 和 pypy (参见 #727, #744, #748, #749, #754, #755, #758, #761, #763, #764, #777 和 #783)

  • 现在 DateDataParser.get_date_data() 返回一个 DateData 对象而不是一个 dict (参见 #778)。

  • 现在错误的 settings 不会静默处理并引发 SettingValidationError (参见 #797)

  • 现在 dateparser.parse() 是确定性的,并且不会尝试先前的区域。此外,DateDataParser.get_date_data() 默认情况下不会尝试先前的区域 (参见 #781)

  • 删除了 'base-formats' 解析器 (参见 #721)

  • 'absolute-time' 解析器中提取了 'no-spaces-time' 解析器,并将其作为可选解析器 (参见 #786)

  • 删除了 numeral_translation_data (参见 #782)

  • 删除了未记录的 SKIP_TOKENS_PARSERFUZZY 设置 (参见 #728, #794)

  • 删除了对 date_formats 中使用字符串的支持 (参见 #726)

  • 未记录的 ExactLanguageSearch 类已移动到私有范围,并且一些内部方法已更改 (参见 #778)

  • dateparser.utils 中的更改:normalize_unicode() 不接受 bytes 作为输入,并且 convert_to_unicode 已弃用 (参见 #749)

新功能

  • 添加了对 Python 3.9 的支持 (参见 #732, #823)

  • 检测由点/句号分隔的小时 (参见 #741)

  • 添加了对“十年”的支持 (参见 #762)

  • 添加了对 Python ≥ 3.6 中伊斯兰日历的支持 (参见 #718)

改进

  • 新标志! (参见 #719)

  • 改进了 README 和文档 (参见 #779, #722)

  • 修复了“calendars”扩展 (参见 #740)

  • 当设置 PREFER_DATES_FROM 时修复了闰年 (参见 #738)

  • 修复 STRICT_PARSING 设置在 no-spaces-time 解析器中(见 #715)

  • 考虑为 relative-time 解析器设置 RETURN_AS_TIME_PERIOD(见 #807)

  • 解析包含时辰信息的大24小时时间格式(见 #634)

  • 其他小改进(见 #698, #709, #710, #712, #730, #731, #735, #739, #784, #788, #795 和 #801)

0.7.6 (2020-06-12)

改进

  • scripts 重命名为 dateparser_scripts 以避免与其他包或项目中的模块发生名称冲突(见 #707)

0.7.5 (2020-06-10)

新功能

  • 添加对 Python 3.8 的支持(见 #664)

  • 实现 REQUIRE_PARTS 设置(见 #703)

  • 添加对下标和上标数字的支持(见 #684)

  • 扩展法语支持(见 #672)

  • 扩展德语支持(见 #673)

改进

  • 将测试套件迁移到 Pytest(见 #662)

  • 添加测试以检查 yamljson 文件内容(见 #663 和 #692)

  • 添加 flake8 管道与 pytest-flake8(见 #665)

  • 添加对无分隔符的8位日期的部分支持(见 #639)

  • 修复可能的 OverflowError 错误,并在解析相对日期时显式避免抛出 ValueError(见 #686)

  • 修复双数字 GMT 和 UTC 解析(见 #632)

  • 修复使用 DATE_ORDER 时的错误(见 #628)

  • 修复解析带时区的相对时间时的错误(见 #503)

  • 修复毫秒解析(见 #572 和 #661)

  • 修复在 PREFER_DATES_FROM 中被错误解释为“未来”的值(见 #629)

  • 其他小改进(见 #667, #675, #511, #626, #512, #509, #696, #702 和 #699)

0.7.4 (2020-03-06)

新功能

  • 扩展挪威语支持(见 #598)

  • 实现 PARSERS 设置(见 #603)

改进

  • 在相对/新鲜度解析器中添加对 PREFER_DATES_FROM 的支持(见 #414)

  • 在基本格式解析器中添加对 PREFER_DAY_OF_MONTH 的支持(见 #611)

  • 将 UTC -00:00 添加为有效偏移量(见 #574)

  • 修复对“一个”的支持(见 #593)

  • 修复解析某些无效日期时的 TypeError(见 #536)

  • 修复非识别字符的词法分析器(见 #622)

  • 防止安装 regex 2019.02.19(见 #600)

  • 解决与原始字符串转义序列相关的 DeprecationWarning(见 #596)

  • 实现用于构建文档的 tox 环境(见 #604)

  • 提高测试稳定性(见 #591, #605)

  • 文档改进(见 #510, #578, #619, #614, #620)

  • 性能改进(见 #570, #569, #625)

0.7.3 (2020-03-06)

  • 损坏版本

0.7.2 (2019-09-17)

功能

  • 扩展捷克语支持

  • time 添加到有效时间段

  • 将时区信息添加到通过 search_dates() 找到的日期

  • 支持字符串作为日期格式

改进

  • 修复了 Collections ABCs 的弃用警告

  • 修复了尾部带有冒号的日期没有被解析

  • 修复了在任何设置更改上覆盖日期格式

  • 修复了将当前工作日解析为过去日期的问题,无论设置如何

  • 添加了 UTC -2:30 作为有效偏移量

  • 将 Python 3.7 添加到支持的版本,并删除了对 Python 3.3 和 3.4 的支持

  • 尽可能从 imp 迁移到 importlib

  • 改进了对加泰罗尼亚语的支持

  • 文档改进

0.7.1 (2019-02-12)

功能/新闻

  • 将检测到的语言添加到 search_dates() 的返回值中

  • 性能改进

  • 刷新了依赖项的版本

改进

  • 修复了不可反序列化的具有时区的 DateTime 对象

  • 修复了正则表达式模式,以避免 Python 3.7 中 re.split 的新行为

  • 修复了解析冒号时抛出的异常

  • 修复了在日期大于30的日子里测试失败的错误

  • 修复了 ZeroDivisionError 异常

0.7.0 (2018-02-08)

在 Google Summer of Code 2017 期间添加的功能

  • 从 Unicode CLDR 数据库(https://github.com/unicode-cldr/cldr-json)中获取语言数据,该数据库包括200多个区域(#321) - 由 Sarthak Maddan 撰写。在 README 中查看当前支持的区域列表的全列表。

  • 从较长的文本字符串中提取日期(#324)- 由Elena Zakharova编写。特别感谢他们出色的贡献!

新功能

  • 添加了格鲁吉亚语(#308)和瑞典语(#305)(独立于CLDR)

改进

  • 改进了对中文(#359)、泰语(#345)、法语(#301、#304)、俄语(#302)的支持

  • 从依赖项中移除ruamel.yaml(#374)。这将减少安装问题数量并提高性能,因为现在我们不再使用YAML作为基本数据存储格式。请注意,YAML仍然用于支持语言文件格式。

  • 通过使用预编译的常用正则表达式和数据懒加载改进性能(#293、#294、#295、#315)

  • 扩展测试(#316、#317、#318、#323)

  • 更新nose_parameterized到当前包,parameterized(#381)

计划在下一版本中实现

  • 完整的语言和区域名称

  • 性能和稳定性改进

  • 文档改进

0.6.0 (2017-03-13)

新功能

  • 在真正的Python日期字符串表示方面保持一致的解析。见#281

  • 添加了对孟加拉语、保加利亚语和印地语语言的支持。

改进

  • 与解析器和系统区域设置相关的重大错误修复。见#277、#282

  • 在设置中检查时区参数的类型。见#267

  • 在需求中锁定依赖项的版本。见#265

  • 改进了对cn、es、荷兰语语言的支持。见#274、#272、#285

打包

  • 使日历作为额外的功能在安装时可用,如果需要使用日历功能。

0.5.1 (2016-12-18)

新功能

  • 添加了对希伯来语的支持

改进

  • 更安全地加载YAML。见#251

  • 改进了对新鲜日期的时区解析。见#256

  • 在需求中锁定依赖项的版本。见#265

  • 改进了对zh、fi语言的支持。见#249、#250、#248、#244

0.5.0 (2016-09-26)

新功能

  • DateDataParser现在也在结果字典中返回检测到的语言。

  • 使用TIMEZONETO_TIMEZONE设置进行明确和清晰的时区转换。

  • 添加了匈牙利语。

  • 添加设置,STRICT_PARSING以忽略不完整的日期。

改进

  • 修复了在问题#219、#222、#207、#224中报告的多个解析器错误。

  • 改进了对中文语言的支持。

  • 为贾拉利和希吉历解析器提供了一致的接口。

0.4.0 (2016-06-17)

新功能

  • 在解析模糊日期时支持基于语言的日期顺序偏好。

  • 支持解析组件之间没有空格的日期。

  • 使用settings支持自定义日期顺序偏好。

  • 支持解析通用相对日期,例如“明天”、“两周后”等。

  • 添加了RELATIVE_BASE设置以将日期上下文设置为过去或未来的任何datetime。

  • 用dateparser自己的解析器替换dateutil.parser.parse

改进

  • 为“中午12点”和“午夜12点”添加了简化。

  • 修复了几个错误

  • 用其活跃的分叉ruamel.yaml替换PyYAML库,该库也修复了在Windows上使用python35进行安装的问题。

  • 更可预测的date_formats处理。

0.3.5 (2016-04-27)

新功能

  • 支持丹麦语。

  • 支持日语。

  • 支持解析带重音的日期字符串。

改进

  • 将languages.yaml转换为基础文件,并为每种语言创建单独的文件。

  • 修复了越南语简化的错误。

  • 不再对python-dateutil有版本限制。

  • 时区解析改进。

  • 修复了测试环境。

  • 清理了语言代码。现在我们严格遵循ISO 639-1中的代码。

  • 改进了中文日期解析。

0.3.4 (2016-03-03)

改进

  • 通过排除最新的python-dateutil版本来修复损坏的版本0.3.3。

0.3.3 (2016-02-29)

新功能

  • 支持芬兰语。

改进

  • 通过切换到正则表达式模块加快解析速度。

  • RETURN_AS_TIMEZONE_AWARE设置以返回tz感知日期对象。

  • 解决了语言之间月份/星期名称相似性的冲突。

0.3.2 (2016-01-25)

新功能

  • 添加了希吉历日历支持。

  • 增加了对日期解析的更好控制的设置。

  • 支持将解析的时间转换为指定时区,适用于完整和相对日期。

改进

  • 修复了在《FreshnessDateDataParser》中缓存< cite>datetime.now的问题。

  • 为几种语言添加了月份名称和星期名称缩写。

  • 俄语和乌克兰语的简化。

  • 修复了解析日期字符串中几种引号的时间组件的问题。

0.3.1 (2015-10-28)

新功能

  • 支持贾拉利日历。

  • 支持白俄罗斯语。

  • 支持印度尼西亚语。

改进

  • 扩展了对俄语和波兰语的支持。

  • 修复了时区识别的bug。

  • 修复了葡萄牙语中“second”翻译错误的问题。

0.3.0 (2015-07-29)

新功能

  • 与Python 3和PyPy兼容。

改进

  • < cite>languages.yaml数据已清理,以便于人类阅读。

  • 改进了西班牙日期解析。

0.2.1 (2015-07-13)

  • 支持具有UTC偏移的日期的通用解析。

  • 支持塔加洛/菲律宾语日期。

  • 改进了对法语和西班牙语日期的支持。

0.2.0 (2015-06-17)

  • 易于使用的parse函数

  • 使用YAML定义语言。

  • 对于非英语语言的解析,采用基于翻译的方法。以前使用< cite>dateutil.parserinfo进行语言定义。

  • 更好的周期提取。

  • 改进了测试。

  • 添加了更多新的简化,以实现更全面的通用解析。

  • 改进了日期的验证。

  • 支持波兰语、泰语和阿拉伯语日期。

  • 支持< cite>pytz时区。

  • 修复了构建和打包问题。

0.1.0 (2014-11-24)

  • PyPI上的第一个版本。

项目详情


由以下支持