■ 前準備
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