2012-03-02 8 views
1

標準のJSpinner.DateEditorに問題があります(おそらく他の人もそうです)。 Java.util.Dateクラスで動作するときは、スピナーのロケールセットからデフォルトのフォーマットのみを取得します。 TimeZoneは無知なようです。TimeZoneで動作するJava JSpinner.DateEditor 3月の時計の変更

英国では2時がない3月の時計変更日に日付が設定されていると、昼間の節約が適用され、01:59:59.999 AMから03:00 AMにジャンプします。

したがって、JSpinner.DateEditorでは、02:00〜02:59:59.999の何も表示させたくありません。時間が1になってクリックされると、3にジャンプしたいと思います。

これを行うには何らかの回避策を実装することはできますか?

感謝

Andez

答えて

4

あなたの質問を編集し、mKorbelsソリューションを読んだ後、約DTS

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(); 
      } 
     }); 
    } 
} 
+0

ごめんなさいmKorbel。将来する予定 – Andez

1

あなたの問題を実証し、私は基本的に何を得るためにそれを使用したことを、このSSCCEを使用してくださいすることができます私は欲しかった。アップをクリックし、JSpinnerのを使用している場合今

package datesandtimes.javax.swing; 

import java.awt.BorderLayout; 
import java.awt.GridLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.text.ParseException; 
import java.text.SimpleDateFormat; 
import java.util.Date; 
import java.util.SimpleTimeZone; 
import java.util.TimeZone; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JSpinner; 
import javax.swing.SpinnerDateModel; 
import javax.swing.SwingUtilities; 
import javax.swing.event.ChangeEvent; 
import javax.swing.event.ChangeListener; 

public class JSpinnerProblem 
     extends JFrame { 

    static { 
     TimeZone simpleTimeZone = new SimpleTimeZone(0, "Elexon Date Time"); 
     TimeZone.setDefault(simpleTimeZone); 
    } 

    private static final String DATE_FORMAT_TIMEZONE = "yyyy-MM-dd HH:mm:ss zzz"; 
    private static final TimeZone tz = TimeZone.getTimeZone("Europe/London");  

    private JPanel panel; 
    private JPanel panelButtons; 
    private JSpinner spinner; 
    private SpinnerDateModel model; 
    private SimpleDateFormat format; 
    private JButton buttonClose; 

    public JSpinnerProblem() { 
     try { 
      setDefaultCloseOperation(JSpinnerProblem.EXIT_ON_CLOSE); 
      setLayout(new BorderLayout(5, 5)); 

      // create instances 
      panel = new JPanel(new BorderLayout()); 
      panelButtons = new JPanel(new GridLayout(1, 1)); 
      model = new SpinnerDateModel(); 
      buttonClose = new JButton("Close"); 

      spinner = new JSpinner(model); 
      spinner.addChangeListener(new ChangeListener() { 

       @Override 
       public void stateChanged(ChangeEvent e) { 

       } 
      }); 

      buttonClose.addActionListener(new ActionListener() { 
       @Override 
       public void actionPerformed(ActionEvent e) { 
        System.exit(0); 
       } 
      }); 

      // set date format 
      format = ((JSpinner.DateEditor) spinner.getEditor()).getFormat(); 
      format.setTimeZone(tz); 
      format.applyPattern("yyyy-MM-dd HH:mm:ss zzz"); 

      // default to march clock change 
      Date d = format.parse("2012-03-25 00:00:00 GMT"); 
      model.setValue(d); 

      panel.add(spinner, BorderLayout.CENTER); 
      panelButtons.add(buttonClose); 

      add(panel, BorderLayout.CENTER); 
      add(panelButtons, BorderLayout.SOUTH); 
      pack(); 

     } catch (ParseException ex) { 
      ex.printStackTrace(); 
     } 
    } 


    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       new JSpinnerProblem().setVisible(true); 
      } 
     }); 
    } 

} 

を、ボタンダウン、実際のタイムゾーンに基づいて正しい時間に時間を変更します。私は、次のようにコードを変更しました。

+0

mKorbelのすべてのクレジット。ありがとう – Andez

関連する問題