在JavaFx中遇到DatePicker问题

时间:2015-02-04 16:21:23

标签: javafx datepicker

我正在尝试转换来自Datepicker但却遇到问题的LocalDate。以下是与DatePicker相关的代码。我正在使用FXML。这应该是自包含的例子。日期的输出是这样的

日期字符串是:2015年1月17日 DateString转换为日期为:2014年12月28日00:00:00 转换为日期的当地日期为:2015年2月17日星期二00:00:00

正如您可以看到转换中的日期更改,从LocalDate到Date再到String到Date

控制器

public class ReportViewerController implements Initializable {
@FXML
private DatePicker datepickerfx1;
@FXML
private DatePicker datepickerfx2;

/**
 * Initializes the controller class.
 */
@Override
public void initialize(URL url, ResourceBundle rb) {
//    LocalDate date = datepickerfx1.getValue();


       datepickerfx1.setOnAction(event -> {
        LocalDate date = datepickerfx1.getValue();
        Instant instant = date.atStartOfDay().atZone(ZoneId.systemDefault()).toInstant();
        Date res = Date.from(instant);
        DateFormat dateFormat = new SimpleDateFormat("ddMMMYYYY");
        String       pexpdateStr= dateFormat.format(res);
        Date newdate=null;
           try {
               newdate = dateFormat.parse(pexpdateStr);
           } catch (ParseException ex) {
               Logger.getLogger(ReportViewerController.class.getName()).log(Level.SEVERE, null, ex);
           }
        System.out.println("Date String is :"+pexpdateStr);
         System.out.println("DateString converted to date is :" +newdate);

        System.out.println("Local date converted to date is :"+res);

           });  
}    

}

FXML文件

<BorderPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="testbed.ReportViewerController">
  <center>
  <GridPane BorderPane.alignment="CENTER">
    <columnConstraints>
      <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
      <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
    </columnConstraints>
    <rowConstraints>
      <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
      <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
      <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
    </rowConstraints>
     <children>
        <HBox prefHeight="100.0" prefWidth="200.0" GridPane.rowIndex="1">
           <children>
              <DatePicker fx:id="datepickerfx1" />
              <DatePicker fx:id="datepickerfx2" />
           </children>
        </HBox>
       </children>
      </GridPane>
    </center>
  </BorderPane>

主文件

public class TestBed extends Application {

@Override
public void start(Stage stage) throws Exception {
    Parent root = FXMLLoader.load(getClass().getResource("ReportViewer.fxml"));

   Rectangle2D screenBounds = Screen.getPrimary().getVisualBounds();
    Scene scene = new Scene(root, screenBounds.getWidth()/3, screenBounds.getHeight()/3);
    scene.setFill(Color.LIGHTGRAY);
    stage.setScene(scene);
    stage.show();
}

/**
 * @param args the command line arguments
 */
public static void main(String[] args) {
    launch(args);
}

}

1 个答案:

答案 0 :(得分:1)

感谢代码jay :-) 这个问题非常简单但具有欺骗性,与这一行有关:

DateFormat dateFormat = new SimpleDateFormat("ddMMMYYYY");

如果您仔细阅读SimpleDateFormat的文档,那么您会注意到资本 Y 和一点 y 之间存在差异。

大Y是指一周也属于哪一年,并且只与一年中第一周和最后一周的日期相关。

现在,文档说&#34; 如果是周年&#39; Y&#39;指定并且日历不支持任何一周,而是使用日历年(&#39; y&#39;)。&#34;这就是为什么你得到pexpdateStr的预期结果。

然而,在解析时,似乎这条规则并不适用,因此您会得到错误的&#39; newdate的结果。

所以你的意思是&#34; ddMMMyyyy&#34;而不是&#34; ddMMMYYYY&#34;,这是一个简单的错误,它将消除不一致性。