いろんな方法が考えられますが、LocalDateTime
を使った方法です。
LocalDateTime.now()
には、Clock
を指定するオーバーロードがあります。
LocalDateTime - now (Java Platform SE 8 )
単体テスト等で使うことが多いと思いますが、今回の目的にも便利に使えます。
今の日時と入力された日時の差をオフセットしたClock
を作ります。
Clock - offset (Java Platform SE 8 )
Duration - between (Java Platform SE 8 )
後は普通の時計と同じように作るだけです(面倒なので超雑です^^;
Java
1import java.time.Clock;
2import java.time.Duration;
3import java.time.LocalDateTime;
4import java.time.format.DateTimeFormatter;
5import javax.swing.JButton;
6import javax.swing.JFrame;
7import javax.swing.JLabel;
8import javax.swing.JPanel;
9import javax.swing.JTextField;
10import javax.swing.Timer;
11
12public class Sample extends JFrame {
13 public static void main(String[] args) {
14 new Sample().setVisible(true);
15 }
16
17 private final DateTimeFormatter inFormatter = DateTimeFormatter.ofPattern("yyyy/M/d/H:m:s");
18 private final DateTimeFormatter outFormatter = DateTimeFormatter.ofPattern("yyyy/MM/dd/HH:mm:ss");
19
20 // 使用するクロック(最初はデフォルト=普通の時計)
21 private Clock clock = Clock.systemDefaultZone();
22
23 Sample() {
24 setDefaultCloseOperation(EXIT_ON_CLOSE);
25 setLocationRelativeTo(null);
26 setSize(300, 200);
27
28 var panel = new JPanel();
29 add(panel);
30
31 var label = new JLabel(outFormatter.format(LocalDateTime.now()));
32 panel.add(label);
33
34 var textField = new JTextField(20);
35 textField.setText("2015/11/3/15:30:00");
36 panel.add(textField);
37
38 var button = new JButton("⏲ 指定日時にタイムトラベル ⏲");
39 button.addActionListener(e -> {
40 // 日時フォーマットを指定してLocalDateTimeに変換(フォーマットがあっていなければ当然エラー)
41 var localDateTime = LocalDateTime.parse(textField.getText(), inFormatter);
42 // 今の日時との差
43 var duration = Duration.between(LocalDateTime.now(), localDateTime);
44 // クロックをずらす
45 clock = Clock.offset(Clock.systemDefaultZone(), duration);
46 });
47 panel.add(button);
48
49 new Timer(1000, e -> {
50 // クロックを指定して今の日時を取得(クロックがずれていれば、ずれた日時)
51 var localDateTime = LocalDateTime.now(clock);
52 // 日時フォーマットを指定してStringに変換
53 label.setText(localDateTime.format(outFormatter));
54 }).start();
55 }
56}
日時フォーマット(0をつけるかどうか)がはっきりしなかったので入出力でわけましたが、お好きにどうぞ。
DateTimeFormatter (Java Platform SE 8 )