mtpを介してAndroidからLinuxにファイルをコピーすると、モバイルデバイスとLinuxのタイムゾーンの違いにより、日付/時刻が誤って変更されます。

mtpを介してAndroidからLinuxにファイルをコピーすると、モバイルデバイスとLinuxのタイムゾーンの違いにより、日付/時刻が誤って変更されます。

編集2:

質問:

USB経由でAndroidからコピーされたファイルに対してLinuxに表示されるファイルの変更時間は、statファイルの作成後にAndroidのタイムゾーン設定を変更すると影響を受けます。

再パフォーマンス:

  1. ライブUSBからUbuntu 20.4(またはLinux Mint 21)を起動します。
  2. Android(バージョン11があり、9の効果も観察されます)では、日時と時間帯を手動で設定し、オフラインモードに設定します。
  3. USB経由でAndroidをLinuxに接続します。
  4. Androidでファイルを選択し、ファイルマネージャを介してLinuxのlocation_1にコピーします。
  5. statコピーしたファイル(location_1のファイル)から実行します。
  6. USBを取り外します(重要)。
  7. Androidのタイムゾーンを時間単位で変更します。
  8. USBを再接続します。
  9. Androidで同じファイルをlocation_2にコピーします。
  10. statコピーしたファイル(location_2のファイル)から実行します。
  11. Modifyオンラインで数時間で違いを確認してください。

働く:

2013年に誰かが質問しました。USB経由でAndroidとLinuxの間でファイルを転送するには?。 2018年の更新された回答によると、mtpが機能していることがわかります。

現在、ほとんどのLinuxディストリビューションはMTPとうまく機能しているようです。私の経験では、Mint(Ubuntuベース)は基本的にうまく機能します。

実際にUSBでデバイスを接続し、Nemo(GUI)アイコンをクリックしてストレージをマウントすると、GUIからファイルを転送できます。

時間帯が重要だとわかりました。携帯電話のタイムゾーンを変更すると、ファイルの変更時間が変わります。 Linuxにコピーすると、statデバイスのタイムゾーンに関係なく、これらの時間とLinuxタイムゾーン(プレス)が維持されるため、ファイルの「元の」(モバイル)タイムゾーンの変更情報が失われます。私の考えでは、物理的に近いデバイスが同じ時間帯に設定されることが多いため、あまり現れませんが、これは理想的な効果ではありません。

mtpこの効果は、物事がどのように機能するかによるものですか、それとも他の要因によって異なりますか?ファイルをコピーするときに両方のデバイスが同じ時間帯に設定されていることを確認せずに正しい時間にコピーする方法に関する提案はありますか?ティア

PS:バグを報告したいのですが、Mint、Ubuntu、Debian、Kernelなどどこにいるのかわかりません。

追加された例:

Androidの場合、ファイルタイムゾーン+1、Linuxタイムゾーン+1

Androidの変更時間は、Linux Mint 21システムベースのNemoのAndroidファイルマネージャとmtpマウントで確認できます(例:9:45:00)。

ext4 fsにコピーした後、Androidのタイムゾーンを+ 3に変更することをstat示しています(USBの取り外し/再挿入/再インストール)。 ext4の他の場所に同じファイルをコピーすると、Linuxのタイムゾーンが+ 3に変わることがわかります。 2番目のコピーでは、次のものが表示されます。Modify:
9:45:00.000000000 +0100
stat
11:45:00.000000000 +0100
stat
13:45:00.000000000 +0300

注:GUIを介して都市ごとにタイムゾーンを選択すると(しかし、Linuxでは他の方法はわかりません)、日付の保存可能性によって結果が1時間ほど異なる場合があります。

答え1

Androidの生のタイムスタンプ:9:45:00.000000000 +0100= 8:45:00 UTC。

Androidのタイムゾーンを+0300に変更し、ファイルをLinuxに転送した後:

11:45:00.000000000 +0100= 10:45:00 UTC

MTPプロトコル仕様(ZIPファイルのMTPforUSB-IFv1.1.pdfページ22)は、タイムスタンプをISO 8601準拠の日付/時刻文字列として処理するようにプロトコルに指示しますが、残念ながらタイムゾーンの表示はありません。任意に選択できる

転送中にタイムスタンプが変更されるという事実は、Android MTP実装が実際のファイルシステムタイムスタンプ(UTCと同じ場合があります)を使用するのではなく、Android UIに表示されるローカライズされたタイムスタンプを使用していることを示します。

このエラーが発生する可能性がある3つのメカニズムが見つかりました。

  • Androidは可能ですローカライズされたタイムスタンプをUTCに誤って変換する転送用現在の既にUTC形式のネイティブファイルシステムタイムスタンプを送信するのではなく、Androidタイムゾーンです。この場合、Android MTP実装には、Linux実装でも使用されるUTC形式のタイムスタンプが含まれます。
  • AndroidはAndroidで現地時間を使用してタイムスタンプを送信します。現在のタイムゾーンですが、タイムゾーンが指定されていません。MTP DateTime文字列では、Linuxはタイムスタンプが独自のローカルタイムゾーンにあると想定しています。
  • AndroidはAndroidの現在のタイムゾーンの現地時間を使用してタイムスタンプを送信し、DateTime文字列でタイムゾーンを指定しますが、Linux MTPの実装タイムゾーン情報を使用しない、独自のローカルタイムゾーンがあるとします。

WiresharkとLinuxusbmonカーネルモジュールを使用してUSBトラフィックをダンプすると、エラーの原因を特定できます。

Linuxでタイムゾーンを変更した後の2番目のコピー:

13:45:00.000000000 +0300= 10:45:00 UTC = 11:45:00 +0100

実際のLinux側のタイムスタンプ(およびエラー)は、最初のコピーとまったく同じです。 13:45:00 +0300 と 11:45:00 +0100 は、すべて同じ瞬間である 10:00 UTC を参照するためです。同じタイムスタンプが異なるローカルタイムゾーンを使用してレンダリングされます。

Linux で初めて送信されたファイルのタイムスタンプを見ると、修正時間も 13:45:00 +0300 になります。これは、現地時間でフォーマットされたすべてのタイムスタンプが+ 0300タイムゾーンを使用して表示されるためです。

関連情報