JCLI诞生记(一)

简介: 前阵子[AliyunCLI](https://develop.aliyun.com/command/cli)开源,同时转变为社区维护软件,这让我第一次有了自己做一个CLI的想法,同时想改进一下CLI的内部实现方法

前阵子AliyunCLI开源,同时转变为社区维护软件,这让我第一次有了自己做一个CLI的想法,同时想改进一下CLI的内部实现方法:AliyunCLI为了判断产品的endpointAction名字,需要依赖对应产品的SDK,在日常的工单处理中,用户在安装SDK时出现的问题比较多,且由于对代码和SDK不甚了解,排查起来有些困难,所以就想做一个纯粹的CLI,他只负责两件事情:一是签名的计算;二是将参数拼接成URL,显示出来或者直接提交。
由于该工具使用Java编写,暂定名为JCLI。

公共参数Timestamp

这里的时间,并不是通常指的那个流逝的“时间”,而是人们定义的“时间”规则,如UTC、GMT等等国际上标准的时间表示和记录方法。阿里云API中,绝大部分产品都有“公共参数”这么一说,而其中也都有Timestamp这个参数,除了标识请求的时间以外,还有一个原因是为了防止中间人攻击,提高签名被猜出的难度。

根据阿里云的官方定义,这个值是请求时的UTC时间,日期格式按照ISO8601标准表示,当时搜了一下网上获取UTC时间的方法,发现五花八门,同时反编译了阿里云官方SDK,发现其中使用了以下的代码来获取UTC时间:

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
sdf.setTimeZone(new SimpleTimeZone(0, "GMT"));
return sdf.format(new Date());

时区ID

其中setTimeZone这个方法,还需要传入SimpleTimeZone这个对象,研究了一下发现使用TimeZone这个类的getTimeZone(String ID)也可以实现类似的方法,省去了一些开销,决定使用TimeZone。于是乎,需要先了解TimeZone工厂方法:TimeZone.getTimeZone。研究之后发现其中传入的getTimeZone这个方法的ID这个参数,查阅了JDK API,发现这个参数竟然可以传三种类型的参数:常规的地区/城市的格式(如America/Los_Angeles)、字母的时区简写(如CTS)和标准化的时间计算方法的名称(如GMT),可以传三种格式的时区字符串呀,很黄很暴力。由于对后两者传入方式不熟悉,打算使用完整的城市名称。联想到UTC时间,就是英国伦敦当地时间嘛,然后就去翻java的ZoneInfo文件,想找一下java关于地区/城市名字的定义,然后就在openjdk的文件夹(jdkmakesunjavazictzdata)里找到了描述文件,翻到了伦敦的完整名称:“Europe/London”。

DaylightSaving

当我开心的在SimpleTimeZone中填入Europe/London作为构造参数后,启动发现服务器总是提示Timestamp不对,比对了一下之前使用new SimpleTimeZone(0, "GMT")这种方式传入的时间,总是晚1个小时:

比正常情况下晚1小时

通过百度查询发现,伦敦地区的时间确实就是6点54分呀,为什么要求的时区要提早一个小时呢?百思不得其解,浏览的各种时区网站后,发现了一个重要的问题:夏令时!

2016年全球各地实施夏令时的情况

国外某些地区为了更好地利用白天的时间,会将时间延后1个小时或0.5个小时,当前伦敦正在处于夏令时状态,所以时间较UTC 0时区的时间会延后1个小时,而Timestamp这个参数只要求是UTC 0时区,忽略夏令时的特殊情况,那么直接使用TimeZone.getTimeZone("GMT+00")就可以拿到要求的UTC 0时区的时间了。

目录
相关文章
|
2月前
|
机器学习/深度学习 算法 JavaScript
为什么分享技术文章无人问津,而工具推荐却大火?
这篇文章探讨了为何工具类文章比技术干货更受欢迎的原因。工具类文章因其实用性强、门槛低、见效快,能迅速提升读者的工作效率,而技术类文章则因学习成本高、见效慢,难以在短期内获得广泛关注。文章还提供了让技术文章更受欢迎的建议,如优化标题、降低门槛及结合实用技巧等。通过借鉴工具文的写作技巧,可以使技术内容更具吸引力,同时保持其深度与专业性。
44 1
|
7月前
|
搜索推荐 数据挖掘 测试技术
邮件营销新风向!5款不容错过的热门软件全面解析!
本文介绍了5款热门邮件营销软件:Zoho Campaigns、Campaign Monitor、Sendinblue、Constant Contact和GetResponse。这些工具各具特色,提供丰富的模板、自动化营销、A/B测试和分析功能。Zoho Campaigns以其强大的集成能力脱颖而出,Campaign Monitor强调易用性,Sendinblue是一站式解决方案,Constant Contact专注于社交和邮件营销,而GetResponse则提供全面的工具和高度自定义选项。每款产品都旨在帮助用户提升邮件营销效率和客户互动。
73 0
|
开发者 程序员 架构师
开发者七夕节行为大赏
听说90%的开发者,都能在这组系列漫画里找到自己
1554 0
|
Kubernetes 安全 搜索推荐
“网红” WebAssembly 与 K8s 如何实现双剑合璧?
WebAssembly 技术已经走出浏览器,让计算无处不在。本文利用 containerd 的扩展机制,可以为 WebAssembly 应用提供与其他容器应用一致的、抽象的、应用分发、交付和运维模型,可以在 Kubernetes 集群中进行统一调度和管理。
“网红” WebAssembly 与 K8s 如何实现双剑合璧?
|
存储 编解码 人工智能
首发!《长安十二时辰背后的技术秘籍》正式公开,速来下载
今天,阿里技术重磅发布电子书《长安十二时辰背后的技术秘籍:从智能算法到音视频创新技术》,已正式开放下载。了解在《长安十二时辰》的荧幕后,工程师在敲敲打打的代码之间,创造出智能算法和音视频技术的新高度。
6965 0
随想随写
工作 如果觉得自己牛逼了,不是你真牛逼了,而是其它人不如你了,这时你要考虑是否需要换个环境了。 如果觉得自己弱了,不是你真不行,而是其它人牛逼,你要做的是心态平稳,向大家多学习。 如果你出成绩快,仔细考虑下,是不是环境里大家都在拼,而不管是不是为了KPI。
1292 0
|
Web App开发 Android开发 开发者