使用SimpleDateFormat的问题

显然,我缺少一些基本的东西。 我在格式化jspinner的值时遇到问题。 我尝试了几种不同的方法并继续收到错误,没有跟踪它们,除了它与我如何从jspinner中获取值有关。

这是微调代码:

//setup date format for both spinners SimpleDateFormat datePattern = new SimpleDateFormat("MM/dd/yyyy"); JSpinner dateFrom = new JSpinner(new SpinnerDateModel()); dateFrom.setEditor(new JSpinner.DateEditor(dateFrom, datePattern.toPattern())); JPanel dateFromPanel = new JPanel(new GridLayout()); dateFromPanel.add(dateFrom); dateFromPanel.setBorder(new TitledBorder("Date - From")); 

以下是我目前正在尝试获取格式的方法:

 SimpleDateFormat sdfSource = new SimpleDateFormat("MM/dd/yyyy"); Date from = sdfSource.parse(dateFrom.getValue().toString()); SimpleDateFormat sdfDestination = new SimpleDateFormat("MM/dd/yyyy"); String dosFrom = sdfDestination.format(from); 

当前错误:线程“main”中的exceptionjava.text.ParseException:Unparseable date:“Mon Oct 23 00:00:00 EDT 2006”

我怀疑问题是这样的:

 dateFrom.getValue().toString() 

我怀疑dateFrom.getValue()只是返回一个Date – 当然没有任何相关的格式。 你应该只使用它来代替解析它:

 Date from = (Date) dateFrom.getValue(); 

我当然可能是错的……但那是我的第一个念头。

你必须阅读关于JSpinners的教程并为JSpinner instace设置SpinnerDateModel ,然后你不需要解决从JSpinner解析Date instance

使用SpinnerDateModel的简单示例

在此处输入图像描述

 import java.awt.*; import java.text.SimpleDateFormat; import java.util.*; import javax.swing.*; import javax.swing.event.*; public class TimeZoneSpinners { private final String[] zones = {"Asia/Tokyo", "Asia/Hong_Kong", "Asia/Calcutta", "Europe/Paris", "Europe/London", "America/New_York", "America/Los_Angeles" }; private final JLabel[] labels = new JLabel[zones.length]; private final SimpleDateFormat[] formats = new SimpleDateFormat[zones.length]; private JSpinner spinner; private SpinnerDateModel model; private SimpleDateFormat format; private JPanel panel; private JFrame frame = new JFrame(); public void makeUI() { Calendar cal = Calendar.getInstance(); Date date = cal.getTime(); model = new SpinnerDateModel(); model.setValue(date); spinner = new JSpinner(model); spinner.addChangeListener(new ChangeListener() { @Override public void stateChanged(ChangeEvent e) { Date date = (Date) ((JSpinner) e.getSource()).getValue(); for (int i = 0; i < labels.length; i++) { labels[i].setText(formats[i].format(date)); } } }); format = ((JSpinner.DateEditor) spinner.getEditor()).getFormat(); format.setTimeZone(TimeZone.getTimeZone(zones[0])); format.applyPattern("yyyy-MM-dd HH:mm:ss"); panel = new JPanel(new GridLayout(zones.length, 2, 10, 10)); for (int i = 0; i < zones.length; i++) { formats[i] = new SimpleDateFormat("yyyy-MMM-dd HH:mm:ss"); formats[i].setTimeZone(TimeZone.getTimeZone(zones[i])); JLabel label = new JLabel(zones[i]); labels[i] = new JLabel(formats[i].format(date)); panel.add(label); panel.add(labels[i]); } frame.setLayout(new BorderLayout(10, 10)); frame.add(spinner, BorderLayout.NORTH); frame.add(panel, BorderLayout.CENTER); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.pack(); frame.setVisible(true); } public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { new TimeZoneSpinners().makeUI(); } }); } } 

我怀疑这是因为你的JSpinner#getValue()方法返回一个Date而你不需要解析它。 你可以尝试用just替换

 Date from = (Date) dateFrom.getValue(); 

调用Date.toString()始终返回当前语言环境的相同默认格式的日期(“Mon Oct 23 00:00:00 …”),这就是您在尝试解析它时遇到exception的原因。

你应该用

 String dosFrom = sdfDestination.format((Date) dateFrom.getValue()); 

问题是dateFrom实际返回所选日期,而Date.toString()不会以您使用的格式返回日期。