Zip::Entry.new
の後ろの方に日時を渡すのではなく、インスタンスの time=
に渡すと秒がズレないようです
entry = Zip::Entry.new(zos, "foo1.txt", nil, nil, nil, nil, nil, nil, dos_time)
↓
entry = Zip::Entry.new(zos, "foo2.txt")
entry.time = dos_time
下のが検証したコードです
require "zip"
require "zip/version"
require "time"
Zip::VERSION # => "2.3.0"
created_at = Time.parse("2020-01-01 00:00:05") # => 2020-01-01 00:00:05 +0900
dos_time = Zip::DOSTime.from_time(created_at) # => 2020-01-01 00:00:05 +0900
io = Zip::OutputStream.write_buffer do |zos|
# ズレる方法
entry = Zip::Entry.new(zos, "foo1.txt", nil, nil, nil, nil, nil, nil, dos_time)
zos.put_next_entry(entry)
# ズレない方法
entry = Zip::Entry.new(zos, "foo2.txt")
entry.time = dos_time
zos.put_next_entry(entry)
end
File.write("foo.zip", io.string)
`unzip -o foo.zip`
puts `ls -go --full-time foo*.txt`
# >> -rw-r--r-- 1 0 2020-01-01 00:00:04.000000000 +0900 foo1.txt
# >> -rw-r--r-- 1 0 2020-01-01 00:00:05.000000000 +0900 foo2.txt
参考
rubyzipを使ってファイル圧縮する際に任意の変更日付をいれてテストしてみたら展開ファイルが1秒ズレてハマったという話。
https://qiita.com/kitaindia/items/894a3a600e0892dc0197