【Java】【Linux】JavaからLinuxのシステム日付を変更するには...

■ 前準備

Linuxのシステム日付を変更する一つの方法として、dateコマンドを実行する必要があるが、
その場合、ルート権限が必要になる。
Java内でdateコマンドを実行しても、以下「エラー時の出力結果」のように表示されてしまい
日付変更できない。そのため、前準備として設定の変更が必要。

エラー時の出力結果

Result Code : 1
sudo: 端末 (tty) が存在せず、パスワードを尋ねる (askpass) プログラムが指定されていません
Done!

設定変更案

「sudo visudo」で、行末に「【実行ユーザ】 ALL=(ALL) NOPASSWD:ALL」に入れる

■ サンプル

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
  public static void main(String[] args) {
    execute("sudo", "date","--set","2017-03-14 23:02:15.962");
    System.out.println("Done!");
  }

  private static void execute(String... commands) {
    ProcessBuilder processBuilder = new ProcessBuilder(commands);
    // 標準エラー出力を標準出力にマージする
    processBuilder.redirectErrorStream(true);

    try {
      Process process = processBuilder.start();
      int result = process.waitFor();
      System.out.println("Result Code : " + result);

      try (BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(process.getInputStream()))) {
        String line;
        while ((line = bufferedReader.readLine()) != null) {
          System.out.println(line);
        }
      }
    } catch (IOException | InterruptedException ex) {
      ex.printStackTrace();
    }
  }
}

出力結果

Result Code : 0
2017年  3月 14日 火曜日 23:02:15 JST
Done!

■ 注意

 * Java で日付変更は可能だが、変更したOS内のJavaシステムで、
   System.currentTimeMillis() を使用している場合は、バグになる可能性があるので注意。

 ※ 詳細は以下の関連記事を参照のこと
Java】 日付・日時 について ~ System.currentTimeMillis / System.nanoTime ~
https://blogs.yahoo.co.jp/dk521123/36845363.html

参考文献

http://stackoverflow.com/questions/18682260/how-can-i-change-the-system-clock-of-a-linux-machine-by-using-java
「端末 (tty) が存在せず、パスワードを尋ねる (askpass) プログラムが指定されていません」関連
http://qiita.com/t_n/items/117d990c273b1d25a3a6

関連記事

Java】 外部プログラム/コマンドを実行するには ~ ProcessBuilder ~ 修正

http://blogs.yahoo.co.jp/dk521123/34842155.html

Java】 日付・日時 について ~ System.currentTimeMillis / System.nanoTime ~

https://blogs.yahoo.co.jp/dk521123/36845363.html