![](/img/trans.png)
[英]Invalid Operation On An ANSI DATETIME (Subtracting one timestamp from another in Teradata)
[英]exiftool—writing one tag by adding/subtracting from another
我有一个包含许多.jpg 和.mov 文件的目录。
Every.jpg 的 DateTimeOriginal 比FileModifyDate多三个小时,而 GPSDateTime 比FileModifyDate多八小时。
但是 every.mov 既没有 DateTimeOriginal 也没有 GPSDateTime。
为了支持将来使用这些文件,我想让它们保持一致。 在研究了一段时间的手册页之后,我尝试了
exiftool '-DateTimeOriginal<FileModifyDate+03:00' \
'-GPSDateTime<FileModifyDate+08:00' *.MOV
但我收到一条错误消息,说我必须使用 = 而不是 < 所以我尝试了
exiftool '-DateTimeOriginal=FileModifyDate+03:00' \
'-GPSDateTime=FileModifyDate+08:00' *.MOV
并收到另一条消息:
Warning: Invalid date/time (use YYYY:mm:dd HH:MM:SS[.ss][+/-HH:MM|Z]) in ExifIFD:DateTimeOriginal (PrintConvInv)
这意味着我必须用文字时间来处理每个标签,而不是从另一个标签开始计算。
我看到我可以将一个标签复制到另一个标签,然后使用 += 或 -= 在另一步骤中更改它。 但是有没有办法在一个命令中完成呢?
首先是答案,但请参阅下文了解一些可能的并发症。
如果两个值的时移相同,那么您将使用GlobalTimeShift
选项,但由于情况并非如此,您需要使用ShiftTime
助手 function 。
此外,MOV 文件中的GPSDateTime
标签将是一个 XMP 标签(特别是在XMP-exif
组中),它允许包含时区并且不需要设置为 UTC。 由于FileModifyDate
已经包含一个时区,而且您似乎想将其转换为 UTC,因此您必须去掉时区。 您可以使用-d
( -dateFormat
) 选项(它将全局设置日期格式)或DateFmt
帮助程序 function来执行此操作,该选项将对单个标签起作用。 Perl 正则表达式替换也是一个选项,但对于此示例,我将使用DateFmt
选项。
你的命令是
exiftool '-DateTimeOriginal<${FileModifyDate;ShiftTime("3")}' '-GPSDateTime<${FileModifyDate;ShiftTime("8");DateFmt("%Y:%m:%d %H:%M:%S")}' *.MOV
对于ShiftTime
function,您只需列出要轮班的小时数,因为这是包含日期和时间的标签中的默认值。 有关详细信息,请参阅ExifTool 日期/时间偏移模块。
现在,您编写此数据的方式存在一些问题。 在 MOV 文件中,exiftool 将在DateTimeOriginal
标签中包含一个时区,除非强制不这样做。 如果不包括时区,则 exiftool 将默认为计算机的本地时区。 因此,如果本地时区不是适用于您的偏移DateTimeOriginal
时间的时区,那么您将需要包括它。 您现在还必须像上面那样去掉时区。 上述命令的变化是
'-DateTimeOriginal<${FileModifyDate;ShiftTime("3");DateFmt("%Y:%m:%d %H:%M:%S")}}±##:00'
此外,如果从两个标签复制操作中删除时区,您可以切换到使用-d
选项。
exiftool -d '%Y:%m:%d %H:%M:%S' '-DateTimeOriginal<${FileModifyDate;ShiftTime("3")}' '-GPSDateTime<${FileModifyDate;ShiftTime("8")}' *.MOV
虽然规范说视频文件中的DateTimeOriginal
标签不需要包含时区,但如果不包含时区,Apple 程序将显示非常不准确的日期/时间(请参阅此 Exiftool 论坛主题)。
除了 Quicktime 标签之外,Exiftool 还将写入XMP-exif:DateTimeOriginal
标签。
对于GPSDateTime
,如果文件的其他时间戳是准确的,可能有更好的写法。 在视频文件中, CreateDate
应该设置为 UTC。 如果该标签设置正确,那么像这样设置GPSDateTime
会更容易
'-GPSDateTime<CreateDate'
应该注意的是, Quicktime:DateTimeOriginal
并不被大多数程序读取,Apple 照片应用程序是一个例外。 此外,视频文件中的 XMP 标签(在本例中XMP-exif:DateTimeOriginal
和XMP-exif:GPSDateTime
)通常不会被大多数程序使用,Adobe 程序除外。 Quicktime:CreateDate
是使用最广泛的标签,因为它应该使用 UTC,所以它也适用于 GPS 日期/时间。
为了分析为什么您的原始命令不起作用,在第一种情况下,您在标签名称中添加了一个 static 字符串。 这导致 exiftool 将整个事物视为一个字符串,这就是为什么它告诉您使用等号=
而不是大于/小于符号<
/ >
,并且大于/小于符号仅在复制标签时使用。 当您将其更改为等号时,您现在正在编写一个 static 字符串,并且由于DateTimeOriginal
标记需要日期/时间格式,您会收到Invalid date/time
错误。
将标签名称与 static 字符串组合时,您需要在标签名称前加上美元符号。 有关详细信息,请参阅-TagsFromFile
选项下以“强大的重定向功能”开头的段落。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.