teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

見直しキャンペーン中

2023/07/29 07:59

投稿

TN8001
TN8001

スコア10111

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