gpt4 book ai didi

java - 尽管值正确,JSpinner 显示的时间仍具有恒定的小时偏移量

转载 作者:行者123 更新时间:2023-11-30 06:53:33 25 4
gpt4 key购买 nike

我有下面的代码应该在 JSpinner 对象中显示时间

Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("GMT"));

cal.set(Calendar.HOUR_OF_DAY, 0);
cal.set(Calendar.AM_PM, 0);
cal.set(Calendar.HOUR, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MILLISECOND, 0);

spStartTime = new JSpinner(new CustomSpinnerModel(cal.getTime(), null, null, cal.get(Calendar.HOUR_OF_DAY), 100, "start"));

((JSpinner.DefaultEditor) spStartTime.getEditor()).getTextField().setFormatterFactory(new DefaultFormatterFactory(new DateFormatter(new SimpleDateFormat("hh:mm:ss,SSS"))));

CustomSpinnerModel 扩展了 SpinnerDateModel,我重写了 getNextValue() 和 getPreviousValue()。

public Object getNextValue()
{
Object next = super.getValue();
Calendar calendar = new GregorianCalendar();

calendar.setTimeZone(TimeZone.getTimeZone("GMT"));
calendar.setTime((Date) next);

Date helper = new Date(calendar.getTimeInMillis() + defaultStep);

calendar.setTime(helper);

System.out.println(calendar.getTimeInMillis());
return calendar.getTime();
}

现在,我第一次点击向上箭头时会打印 100 毫秒,这意味着该值是正确的,因为我从 0 毫秒开始。问题是我在 JSpinner 中看到的是

02:00:00,100

可视化中存在恒定的 2 小时偏移。

最佳答案

我认为DateFormat#setTimeZone(TimeZone)是您正在寻找的:

//((JSpinner.DefaultEditor) spStartTime.getEditor()).getTextField()
// .setFormatterFactory(new DefaultFormatterFactory(
// new DateFormatter(new SimpleDateFormat("hh:mm:ss,SSS"))));
SimpleDateFormat format = new SimpleDateFormat("HH:mm:ss,SSS");
format.setTimeZone(TimeZone.getTimeZone("GMT"));
((JSpinner.DefaultEditor) spStartTime.getEditor()).getTextField()
.setFormatterFactory(new DefaultFormatterFactory(
new DateFormatter(format)));
import java.awt.*;
import java.text.*;
import java.util.*;
import javax.swing.*;
import javax.swing.text.*;

public class DateEditorTimeZoneTest {
public JComponent makeUI() {
SimpleDateFormat format = new SimpleDateFormat("HH:mm:ss,SSS");
format.setTimeZone(TimeZone.getTimeZone("GMT"));

Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
cal.clear(Calendar.HOUR_OF_DAY);
cal.clear(Calendar.AM_PM);
cal.clear(Calendar.HOUR);
cal.clear(Calendar.MINUTE);
cal.clear(Calendar.SECOND);
cal.clear(Calendar.MILLISECOND);

Date start = cal.getTime();
System.out.println(start);
System.out.println(format.format(start));

int defaultStep = 100;
JSpinner spinner = new JSpinner(new SpinnerDateModel(
start, null, null, Calendar.MILLISECOND) {
@Override public void setCalendarField(int calendarField) {
// If you only want one field to spin you can subclass
// and ignore the setCalendarField calls.
}
@Override public Object getNextValue() {
Object next = super.getValue();
Calendar calendar = new GregorianCalendar();
calendar.setTimeZone(TimeZone.getTimeZone("GMT"));
calendar.setTime((Date) next);
Date helper = new Date(calendar.getTimeInMillis() + defaultStep);
calendar.setTime(helper);
System.out.println(calendar.getTimeInMillis());
return calendar.getTime();
}
//@Override public Object getPreviousValue() {
// //...
//}
});
JSpinner.DateEditor editor = new JSpinner.DateEditor(spinner, "HH:mm:ss,SSS");
spinner.setEditor(editor);
editor.getTextField().setFormatterFactory(
new DefaultFormatterFactory(new DateFormatter(format)));

JPanel p = new JPanel();
p.add(spinner);
return p;
}
public static void main(String... args) {
EventQueue.invokeLater(() -> {
JFrame f = new JFrame();
f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
f.getContentPane().add(new DateEditorTimeZoneTest().makeUI());
f.setSize(320, 240);
f.setLocationRelativeTo(null);
f.setVisible(true);
});
}
}

关于java - 尽管值正确,JSpinner 显示的时间仍具有恒定的小时偏移量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42247801/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com