我正在研究Java7项目,我们需要一个国际原子时间的时间戳.我发现了一些与此相关的问题,指向JSR-310和ThreeTen Project(正在实现JSR-310):
http://www.coderanch.com/t/549178/java/java/TAI-Atomic-Time-International
但是,我正在努力研究用于Java 7的确切内容以及从何处获取它.似乎有ThreeTen的旧SourceForge和GitHub页面,以及OpenJDK页面.
我找到了Java 7反向端口,但是从Maven下载后它不包含TAIInstant类,这是我真正需要的(TIAInstant类列在ThreeTen SourceForge JavaDoc上,位于javax.time.TAIInstant下).
为了完整起见,这是我的pom.xml的摘录:
<dependency>
<groupId>org.threeten</groupId>
<artifactId>threetenbp</artifactId>
<version>0.8.1</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)
我应该使用其他东西,我应该从哪里获取它?
注意:抱歉,我无法提供指向我所指的所有页面的链接,StackOverflow不会让每个帖子都有> 2个链接而没有更高的代表.
[编辑]
想要TAI的原因是我需要一个单调增加的时间戳,我相信TAI会满足(即使在正和负闰秒期间,因为它不关心闰秒计算所有秒数,包括飞跃秒).
从各种来源阅读了关于POSIX/Unix的时间后,我仍然不清楚在闰秒的Unix时间内发生了什么.我知道Unix时间在引用UTC时间方面是模棱两可的,但我不清楚在闰秒发生的瞬间Unix时间会发生什么?Unix时间'暂停'还是倒退例如?也许更重要的是,即使它不应该根据Unix时间规范,Unix实现是否真的遵守关于闰秒的规范......?
最后,我是否正确地说System.currentTimeMillis()将获得相当于POSIX时间(虽然以毫秒而不是秒)?
注意,我需要一个可以在JVM和机器上移植的对象(排除System.nanoTime()或类似的东西).
[结论]
TAI
TAI是一个测量时间的系统,每秒计算一次并且"所有秒都相等" - 即.每秒包含相同的时间段,所有秒数(包括闰秒)都计入总数中.这意味着TAI中的秒数(从某个任意起始点开始计算,例如Unix Epoch)是一个单调递增的整数.
POSIX时间
POSIX时间是用于测量时间的标准(不是实现).它将每天定义为恰好有86400秒.因此,POSIX时间不计算闰秒(因为偶尔一分钟可能有61秒,导致天数> 86400秒,理论上一分钟可能有59秒,导致天数<86400秒).这意味着POSIX中的'秒'具有可变长度,并且在闰秒之前/期间/之后不久,POSIX时钟可以跳过秒或重复它们.具体来说,Meno Hochschild在其答案中引用的POSIX规范指出,"实际时间与自大纪元以来秒的当前值之间的关系尚未明确."
UTC
UTC是一个时间标准,它与地球绕太阳运行的方式有关,旨在维持太阳位置与一天中的时间(在一个阈值内)之间的关系.即在地球的UTC + 0区域,太阳总是在UTC时间中午处于最高点.闰秒(正面或负面)是必要的,因为地球自转的速度不固定,并且它不会以可预测的方式变化(意味着我们无法预测何时需要闰秒 - 或者它们是否为正闰秒或负闰秒)
代表时代
在我看来,TAI和POSIX都代表"秒数"(即计算机实际存储容易的东西),而UTC是时间的"人类解释"(即年/月/日)小时:分钟:秒.毫秒)通常不会由计算机内部存储.
翻译时间
鉴于上述情况,有许多问题从POSIX(没有任何闰秒计算)转换为TAI(计算闰秒):
另一方面,很容易从POSIX转换为UTC'人类解释'.它不需要知道闰秒,因为它只假设每天都有相同的秒数(虽然这些'秒'中的一些实际上有不同的时间长度).实际上,您只需使用POSIX Spec中的公式的倒数来获得各种UTC时间分量(再次参见Meno Hochschild引用的POSIX规范).
我正在使用Ansible管理许多不同的服务器.每个服务器上有多个Linux用户,如readonly,admin等.
我的Ansible项目中还有一些文件,其中包含特定人群的所有SSH密钥 - 例如.AppDevelopersPublicKeys,DbaPublicKeys等等.
不同的人群在不同的服务器上具有不同的访问级别.例如.在WebServer上,AppDevelopers具有管理员访问权限,而DBA可能只具有读取权限.在数据库服务器上,反之亦然.
为了实现上述目标,我有不同类型的服务器的不同Ansible角色(例如WebAppServer,DatabaseServer等).然后,这些角色具有变量readonly_key_files并admin_key_files针对它们进行设置,列出了应该具有只读和管理访问权限的角色的相应密钥文件.
理想的解决方案是:
AppDeveloperPublicKeysAnsible文件中删除公钥,服务器也会删除此密钥--diff选项运行Ansible 时显示文件的准确差异我正在使用Ansible 2.2.0.0
以下所有内容均不符合我的要求:
authorized_key with_file
- authorized_key: user=readonly exclusive=no key={{item}}
with_file: {{readonly_key_files}}
Run Code Online (Sandbox Code Playgroud)
exclusive必须设置为noauthorized_key与事实
解决方案按照https://github.com/ansible/ansible-modules-core/pull/4167/files
- name: "Generate developer keys from multiple files"
set_fact: dev_key_list="{{ lookup('file', item) }}"
register: dev_keys
with_items: '{{developer_key_files}}'
- name: "Merge developer keys into single list"
set_fact: …Run Code Online (Sandbox Code Playgroud) 使用 Rails 5:
gem 'rails', '~> 5.0.0', '>= 5.0.0.1'
Run Code Online (Sandbox Code Playgroud)
我已经创建了我能想到的最简单的例子来演示这个问题:
父母.rb
class Parent < ApplicationRecord
has_many :children
accepts_nested_attributes_for :children
end
Run Code Online (Sandbox Code Playgroud)
孩子.rb
class Child < ApplicationRecord
belongs_to :parent
end
Run Code Online (Sandbox Code Playgroud)
创建父项,保存,创建子项,保存(有效)
使用rails console,创建一个新的父级,然后保存,然后从父级构建一个子级,然后保存父级,工作正常:
irb(main):004:0> parent = Parent.new
=> #<Parent id: nil, created_at: nil, updated_at: nil>
irb(main):005:0> parent.save
(0.5ms) BEGIN
SQL (0.4ms) INSERT INTO `parents` (`created_at`, `updated_at`) VALUES ('2016-09-25 13:05:44', '2016-09-25 13:05:44')
(3.2ms) COMMIT
=> true
irb(main):006:0> parent.children.build
=> #<Child id: nil, parent_id: 1, created_at: nil, updated_at: nil>
irb(main):007:0> parent.save
(0.5ms) …Run Code Online (Sandbox Code Playgroud)