Repository: wicket
Updated Branches:
  refs/heads/WICKET-6105-java.time c25e05e31 -> 2f1b9251b


Time field is rewritten to be independent component, build is fixed


Project: http://git-wip-us.apache.org/repos/asf/wicket/repo
Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/2f1b9251
Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/2f1b9251
Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/2f1b9251

Branch: refs/heads/WICKET-6105-java.time
Commit: 2f1b9251b8f1a50a53ac40319eff22f5b7591869
Parents: c25e05e
Author: Maxim Solodovnik <[email protected]>
Authored: Tue Sep 26 23:47:14 2017 +0700
Committer: Maxim Solodovnik <[email protected]>
Committed: Tue Sep 26 23:47:14 2017 +0700

----------------------------------------------------------------------
 wicket-examples/pom.xml                         | 120 ++---
 .../ajax/builtin/modal/ModalContent1Page.html   |  12 +-
 .../ajax/builtin/modal/ModalContent1Page.java   |   7 +
 .../ajax/builtin/modal/ModalContent2Page.java   |   1 +
 .../ajax/builtin/modal/ModalPanel1.java         |  19 +-
 .../ajax/builtin/modal/ModalWindowPage.java     |   6 +
 .../bean/validation/BeanValidationPage.html     |  21 +-
 .../bean/validation/BeanValidationPage.java     |   4 +-
 .../markup/html/form/datetime/DateField.java    |  39 +-
 .../markup/html/form/datetime/DateLabel.java    |   2 +-
 .../html/form/datetime/DateTimeField.html       |   5 +-
 .../html/form/datetime/DateTimeField.java       | 387 ++--------------
 .../html/form/datetime/LocalDateConverter.java  |   2 +-
 .../html/form/datetime/LocalTimeConverter.java  | 103 +++++
 .../form/datetime/PatternDateConverter.java     |  24 +-
 .../form/datetime/PatternTimeConverter.java     |  85 ++++
 .../datetime/PatternZonedDateTimeConverter.java |  97 ++++
 .../html/form/datetime/StyleDateConverter.java  |  62 +--
 .../html/form/datetime/StyleTimeConverter.java  | 118 +++++
 .../datetime/StyleZonedDateTimeConverter.java   |   2 +-
 .../markup/html/form/datetime/TimeField.html    |  25 ++
 .../markup/html/form/datetime/TimeField.java    | 441 ++++++++++++++++++-
 .../html/form/datetime/DateConverterTest.java   |   4 +-
 23 files changed, 1032 insertions(+), 554 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/wicket/blob/2f1b9251/wicket-examples/pom.xml
----------------------------------------------------------------------
diff --git a/wicket-examples/pom.xml b/wicket-examples/pom.xml
index b18a14f..0049b0a 100644
--- a/wicket-examples/pom.xml
+++ b/wicket-examples/pom.xml
@@ -31,32 +31,32 @@
                action.
        </description>
 
-    <properties>
-        <docker-maven-plugin.version>1.0.0</docker-maven-plugin.version>
-    </properties>
+       <properties>
+               <docker-maven-plugin.version>1.0.0</docker-maven-plugin.version>
+       </properties>
 
        <dependencyManagement>
-       <dependencies>
-               <dependency>
-                       <groupId>com.github.axet</groupId>
-                       <artifactId>kaptcha</artifactId>
-                       <version>0.0.9</version>
-               </dependency>
-               <dependency>
-                       <groupId>com.github.cage</groupId>
-                       <artifactId>cage</artifactId>
-                       <version>1.0</version>
-               </dependency>
-               <dependency>
-                       <groupId>org.codelibs</groupId>
-                       <artifactId>jhighlight</artifactId>
-                       <version>1.0.3</version>
-                       <exclusions>
-                               <exclusion>
-                                       <groupId>javax.servlet</groupId>
-                                       <artifactId>servlet-api</artifactId>
-                               </exclusion>
-                       </exclusions>
+               <dependencies>
+                       <dependency>
+                               <groupId>com.github.axet</groupId>
+                               <artifactId>kaptcha</artifactId>
+                               <version>0.0.9</version>
+                       </dependency>
+                       <dependency>
+                               <groupId>com.github.cage</groupId>
+                               <artifactId>cage</artifactId>
+                               <version>1.0</version>
+                       </dependency>
+                       <dependency>
+                               <groupId>org.codelibs</groupId>
+                               <artifactId>jhighlight</artifactId>
+                               <version>1.0.3</version>
+                               <exclusions>
+                                       <exclusion>
+                                               <groupId>javax.servlet</groupId>
+                                               
<artifactId>servlet-api</artifactId>
+                                       </exclusion>
+                               </exclusions>
                        </dependency>
                </dependencies>
        </dependencyManagement>
@@ -142,10 +142,10 @@
                        <groupId>org.apache.wicket</groupId>
                        <artifactId>wicket-velocity</artifactId>
                </dependency>
-        <dependency>
-            <groupId>org.apache.wicket</groupId>
-            <artifactId>wicket-native-websocket-javax</artifactId>
-        </dependency>
+               <dependency>
+                       <groupId>org.apache.wicket</groupId>
+                       <artifactId>wicket-native-websocket-javax</artifactId>
+               </dependency>
                <dependency>
                        <groupId>org.codelibs</groupId>
                        <artifactId>jhighlight</artifactId>
@@ -235,38 +235,38 @@
                </plugins>
                <pluginManagement>
                        <plugins>
-                       <plugin>
-                               <groupId>org.apache.maven.plugins</groupId>
-                               <artifactId>maven-javadoc-plugin</artifactId>
-                               <configuration>
-                                       <skip>true</skip>
-                               </configuration>
-                       </plugin>
-                       <plugin>
-                               <groupId>org.apache.maven.plugins</groupId>
-                               <artifactId>maven-war-plugin</artifactId>
-                               <configuration>
-                                       <!--  include the manifest entries so 
that we can emit the version of the examples. -->
-                                       <archive>
-                                               <manifest>
-                                                       
<addDefaultImplementationEntries>true</addDefaultImplementationEntries>
-                                                       
<addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>
-                                               </manifest>
-                                       </archive>
-                               </configuration>
-                       </plugin>
-                       <plugin>
-                               <groupId>org.mortbay.jetty</groupId>
-                               <artifactId>jetty-maven-plugin</artifactId>
-                    <version>${jetty.version}</version>
-                    <dependencies>
-                               <dependency>
-                                       <groupId>javax.validation</groupId>
-                                       <artifactId>validation-api</artifactId>
-                                       <version>1.1.0.Final</version>
-                               </dependency>
-                    </dependencies>
-                       </plugin>
+                               <plugin>
+                                       
<groupId>org.apache.maven.plugins</groupId>
+                                       
<artifactId>maven-javadoc-plugin</artifactId>
+                                       <configuration>
+                                               <skip>true</skip>
+                                       </configuration>
+                               </plugin>
+                               <plugin>
+                                       
<groupId>org.apache.maven.plugins</groupId>
+                                       
<artifactId>maven-war-plugin</artifactId>
+                                       <configuration>
+                                               <!--  include the manifest 
entries so that we can emit the version of the examples. -->
+                                               <archive>
+                                                       <manifest>
+                                                               
<addDefaultImplementationEntries>true</addDefaultImplementationEntries>
+                                                               
<addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>
+                                                       </manifest>
+                                               </archive>
+                                       </configuration>
+                               </plugin>
+                               <plugin>
+                                       <groupId>org.mortbay.jetty</groupId>
+                                       
<artifactId>jetty-maven-plugin</artifactId>
+                                       <version>${jetty.version}</version>
+                                       <dependencies>
+                                               <dependency>
+                                                       
<groupId>javax.validation</groupId>
+                                                       
<artifactId>validation-api</artifactId>
+                                                       
<version>1.1.0.Final</version>
+                                               </dependency>
+                                       </dependencies>
+                               </plugin>
                        </plugins>
                </pluginManagement>
        </build>

http://git-wip-us.apache.org/repos/asf/wicket/blob/2f1b9251/wicket-examples/src/main/java/org/apache/wicket/examples/ajax/builtin/modal/ModalContent1Page.html
----------------------------------------------------------------------
diff --git 
a/wicket-examples/src/main/java/org/apache/wicket/examples/ajax/builtin/modal/ModalContent1Page.html
 
b/wicket-examples/src/main/java/org/apache/wicket/examples/ajax/builtin/modal/ModalContent1Page.html
index c5e8099..528940e 100644
--- 
a/wicket-examples/src/main/java/org/apache/wicket/examples/ajax/builtin/modal/ModalContent1Page.html
+++ 
b/wicket-examples/src/main/java/org/apache/wicket/examples/ajax/builtin/modal/ModalContent1Page.html
@@ -2,11 +2,11 @@
 <html xmlns:wicket="http://wicket.apache.org";>
        <head>
                <title>This is modal window</title>
-               <style type="text/css">                 
+               <style type="text/css">
                        body {
                                font-family: verdana, sans-serif;
                                font-size: 82%;
-                               background-color: white;                        
        
+                               background-color: white;
                        }
                </style>
        </head> 
@@ -18,13 +18,11 @@
                </p>
                <p>
                        <div wicket:id="modal"></div>
-                       <a wicket:id="open">Open another modal dialog</a>       
                
+                       <a wicket:id="open">Open another modal dialog</a>
                </p>
-                 
                <p>
-                 <div>An example of a component that uses header 
contributions</div>
-                 <div wicket:id="dateTimeField" />
+                       <div>An example of a component that uses header 
contributions</div>
+                       <div wicket:id="dateTimeField" />
                </p>
-                 
        </body>
 </html>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/wicket/blob/2f1b9251/wicket-examples/src/main/java/org/apache/wicket/examples/ajax/builtin/modal/ModalContent1Page.java
----------------------------------------------------------------------
diff --git 
a/wicket-examples/src/main/java/org/apache/wicket/examples/ajax/builtin/modal/ModalContent1Page.java
 
b/wicket-examples/src/main/java/org/apache/wicket/examples/ajax/builtin/modal/ModalContent1Page.java
index 4111a46..5c252e4 100644
--- 
a/wicket-examples/src/main/java/org/apache/wicket/examples/ajax/builtin/modal/ModalContent1Page.java
+++ 
b/wicket-examples/src/main/java/org/apache/wicket/examples/ajax/builtin/modal/ModalContent1Page.java
@@ -30,6 +30,7 @@ import org.apache.wicket.markup.html.WebPage;
  */
 public class ModalContent1Page extends WebPage
 {
+       private static final long serialVersionUID = 1L;
 
        /**
         * 
@@ -40,6 +41,8 @@ public class ModalContent1Page extends WebPage
        {
                add(new AjaxLink<Void>("closeOK")
                {
+                       private static final long serialVersionUID = 1L;
+
                        @Override
                        public void onClick(AjaxRequestTarget target)
                        {
@@ -51,6 +54,8 @@ public class ModalContent1Page extends WebPage
 
                add(new AjaxLink<Void>("closeCancel")
                {
+                       private static final long serialVersionUID = 1L;
+
                        @Override
                        public void onClick(AjaxRequestTarget target)
                        {
@@ -85,6 +90,8 @@ public class ModalContent1Page extends WebPage
 
                add(new AjaxLink<Void>("open")
                {
+                       private static final long serialVersionUID = 1L;
+
                        @Override
                        public void onClick(AjaxRequestTarget target)
                        {

http://git-wip-us.apache.org/repos/asf/wicket/blob/2f1b9251/wicket-examples/src/main/java/org/apache/wicket/examples/ajax/builtin/modal/ModalContent2Page.java
----------------------------------------------------------------------
diff --git 
a/wicket-examples/src/main/java/org/apache/wicket/examples/ajax/builtin/modal/ModalContent2Page.java
 
b/wicket-examples/src/main/java/org/apache/wicket/examples/ajax/builtin/modal/ModalContent2Page.java
index 0189a93..4b668ac 100644
--- 
a/wicket-examples/src/main/java/org/apache/wicket/examples/ajax/builtin/modal/ModalContent2Page.java
+++ 
b/wicket-examples/src/main/java/org/apache/wicket/examples/ajax/builtin/modal/ModalContent2Page.java
@@ -28,6 +28,7 @@ import org.apache.wicket.markup.html.WebPage;
  */
 public class ModalContent2Page extends WebPage
 {
+       private static final long serialVersionUID = 1L;
 
        /**
         * @param window

http://git-wip-us.apache.org/repos/asf/wicket/blob/2f1b9251/wicket-examples/src/main/java/org/apache/wicket/examples/ajax/builtin/modal/ModalPanel1.java
----------------------------------------------------------------------
diff --git 
a/wicket-examples/src/main/java/org/apache/wicket/examples/ajax/builtin/modal/ModalPanel1.java
 
b/wicket-examples/src/main/java/org/apache/wicket/examples/ajax/builtin/modal/ModalPanel1.java
index ec7bae6..3a9389a 100644
--- 
a/wicket-examples/src/main/java/org/apache/wicket/examples/ajax/builtin/modal/ModalPanel1.java
+++ 
b/wicket-examples/src/main/java/org/apache/wicket/examples/ajax/builtin/modal/ModalPanel1.java
@@ -16,8 +16,6 @@
  */
 package org.apache.wicket.examples.ajax.builtin.modal;
 
-import java.util.Map;
-
 import org.apache.wicket.extensions.markup.html.form.datetime.DateTimeField;
 import org.apache.wicket.markup.html.panel.Panel;
 
@@ -26,6 +24,7 @@ import org.apache.wicket.markup.html.panel.Panel;
  */
 public class ModalPanel1 extends Panel
 {
+       private static final long serialVersionUID = 1L;
 
        /**
         * @param id
@@ -33,20 +32,6 @@ public class ModalPanel1 extends Panel
        public ModalPanel1(String id)
        {
                super(id);
-
-               add(new DateTimeField("dateTimeField")
-               {
-                       /**
-                        * @see DateTimeField#configure(java.util.Map)
-                        */
-                       @Override
-                       protected void configure(Map<String, Object> 
widgetProperties)
-                       {
-                               super.configure(widgetProperties);
-                               // IE 6 breaks layout with iframe - is that a 
YUI bug?
-                               widgetProperties.put("iframe", false);
-                       }
-               });
+               add(new DateTimeField("dateTimeField"));
        }
-
 }

http://git-wip-us.apache.org/repos/asf/wicket/blob/2f1b9251/wicket-examples/src/main/java/org/apache/wicket/examples/ajax/builtin/modal/ModalWindowPage.java
----------------------------------------------------------------------
diff --git 
a/wicket-examples/src/main/java/org/apache/wicket/examples/ajax/builtin/modal/ModalWindowPage.java
 
b/wicket-examples/src/main/java/org/apache/wicket/examples/ajax/builtin/modal/ModalWindowPage.java
index 7de1620..f8376ff 100644
--- 
a/wicket-examples/src/main/java/org/apache/wicket/examples/ajax/builtin/modal/ModalWindowPage.java
+++ 
b/wicket-examples/src/main/java/org/apache/wicket/examples/ajax/builtin/modal/ModalWindowPage.java
@@ -29,6 +29,8 @@ import org.apache.wicket.model.PropertyModel;
  */
 public class ModalWindowPage extends BasePage
 {
+       private static final long serialVersionUID = 1L;
+
        public ModalWindowPage()
        {
                final Label result;
@@ -53,6 +55,8 @@ public class ModalWindowPage extends BasePage
 
                add(new AjaxLink<Void>("showModal1")
                {
+                       private static final long serialVersionUID = 1L;
+
                        @Override
                        public void onClick(AjaxRequestTarget target)
                        {
@@ -80,6 +84,8 @@ public class ModalWindowPage extends BasePage
 
                add(new AjaxLink<Void>("showModal2")
                {
+                       private static final long serialVersionUID = 1L;
+
                        @Override
                        public void onClick(AjaxRequestTarget target)
                        {

http://git-wip-us.apache.org/repos/asf/wicket/blob/2f1b9251/wicket-examples/src/main/java/org/apache/wicket/examples/bean/validation/BeanValidationPage.html
----------------------------------------------------------------------
diff --git 
a/wicket-examples/src/main/java/org/apache/wicket/examples/bean/validation/BeanValidationPage.html
 
b/wicket-examples/src/main/java/org/apache/wicket/examples/bean/validation/BeanValidationPage.html
index a459fd9..db04a1c 100644
--- 
a/wicket-examples/src/main/java/org/apache/wicket/examples/bean/validation/BeanValidationPage.html
+++ 
b/wicket-examples/src/main/java/org/apache/wicket/examples/bean/validation/BeanValidationPage.html
@@ -5,15 +5,17 @@
 <style>
        .note { font-size:.8em; }
        .required {font-weight: bold;}
+       table {border-collapse: collapse; border-spacing: 0;}
+       th, td {padding: 4px;}
 </style>
 </head>
 <body>
-       <span wicket:id="mainNavigation" />
+       <span wicket:id="mainNavigation"></span>
 
        <div wicket:id="feedbackErrors"></div>
-       
+
        <form wicket:id="form" novalidate="novalidate">
-               <table cellspacing="0" cellpadding="4">
+               <table style="border-collapse: collapse; border-spacing: 0;">
                        <tr>
                                <td><label 
wicket:for="name"><wicket:label>Name</wicket:label></label></td>
                                <td><input wicket:id="name" type="text" 
size="30"/></td>
@@ -35,11 +37,12 @@
                                <td><pre class="note">m/d/yyyy field with 
@Past</pre></td>
                        </tr>
                        <tr>
-                <td><label 
wicket:for="password"><wicket:label>Password</wicket:label></label></td>
-                <td><input wicket:id="password" type="text" size="10"/></td>
-                <td><pre class="note">Custom constraint @ValidPassword with 
custom message bundles.<br/>A valid password must contain only alphanumeric 
chars and at least two digits.</pre>
-                </td>
-            </tr>
+                               <td><label 
wicket:for="password"><wicket:label>Password</wicket:label></label></td>
+                               <td><input wicket:id="password" type="text" 
size="10"/></td>
+                               <td>
+                                       <pre class="note">Custom constraint 
@ValidPassword with custom message bundles.<br/>A valid password must contain 
only alphanumeric chars and at least two digits.</pre>
+                               </td>
+                       </tr>
                        <tr>
                                <td></td>
                                <td>
@@ -49,6 +52,6 @@
                        </tr>
                </table>
        </form>
-    <div wicket:id="feedbackSuccess"></div>
+       <div wicket:id="feedbackSuccess"></div>
 </body>
 </html>

http://git-wip-us.apache.org/repos/asf/wicket/blob/2f1b9251/wicket-examples/src/main/java/org/apache/wicket/examples/bean/validation/BeanValidationPage.java
----------------------------------------------------------------------
diff --git 
a/wicket-examples/src/main/java/org/apache/wicket/examples/bean/validation/BeanValidationPage.java
 
b/wicket-examples/src/main/java/org/apache/wicket/examples/bean/validation/BeanValidationPage.java
index b69b019..e1eb59d 100644
--- 
a/wicket-examples/src/main/java/org/apache/wicket/examples/bean/validation/BeanValidationPage.java
+++ 
b/wicket-examples/src/main/java/org/apache/wicket/examples/bean/validation/BeanValidationPage.java
@@ -18,7 +18,7 @@ package org.apache.wicket.examples.bean.validation;
 
 import org.apache.wicket.bean.validation.PropertyValidator;
 import org.apache.wicket.extensions.markup.html.form.datetime.DateField;
-import 
org.apache.wicket.extensions.markup.html.form.datetime.StyleZonedDateTimeConverter;
+import 
org.apache.wicket.extensions.markup.html.form.datetime.StyleDateConverter;
 import org.apache.wicket.examples.WicketExamplePage;
 import org.apache.wicket.feedback.ExactLevelFeedbackMessageFilter;
 import org.apache.wicket.feedback.FeedbackMessage;
@@ -53,7 +53,7 @@ public class BeanValidationPage extends WicketExamplePage
                form.add(new TextField<>("phone", new 
PropertyModel<String>(this, "person.phone")).add(new PropertyValidator<>()));
                form.add(new TextField<>("email", new 
PropertyModel<String>(this, "person.email")).add(new PropertyValidator<>()));
                form.add(new DateField("birthdate", new PropertyModel<>(this, 
"person.birthdate"),
-                       new StyleZonedDateTimeConverter("S-", true)).add(new 
PropertyValidator<>()));
+                       new StyleDateConverter("S-")).add(new 
PropertyValidator<>()));
                form.add(new TextField<>("password", new 
PropertyModel<String>(this, "person.password")).add(new PropertyValidator<>()));
                
                add(new FeedbackPanel("feedbackSuccess", new 
ExactLevelFeedbackMessageFilter(FeedbackMessage.INFO)));

http://git-wip-us.apache.org/repos/asf/wicket/blob/2f1b9251/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/DateField.java
----------------------------------------------------------------------
diff --git 
a/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/DateField.java
 
b/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/DateField.java
index d4b5ef4..88d2637 100644
--- 
a/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/DateField.java
+++ 
b/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/DateField.java
@@ -51,7 +51,7 @@ public class DateField extends TextField<LocalDate> 
implements ITextFormatProvid
        private static final long serialVersionUID = 1L;
 
        /**
-        * Creates a new DateTextField defaulting to using a short date pattern
+        * Creates a new DateField defaulting to using a short date pattern
         * 
         * @param id
         *            The id of the text field
@@ -60,22 +60,22 @@ public class DateField extends TextField<LocalDate> 
implements ITextFormatProvid
         * @param datePattern
         *            The pattern to use. Must be not null. See {@link 
SimpleDateFormat} for available
         *            patterns.
-        * @return DateTextField
+        * @return DateField
         */
        public static DateField forDatePattern(String id, IModel<LocalDate> 
model, String datePattern)
        {
-               return new DateField(id, model, new 
PatternDateConverter(datePattern, true));
+               return new DateField(id, model, new 
PatternDateConverter(datePattern));
        }
 
        /**
-        * Creates a new DateTextField defaulting to using a short date pattern
+        * Creates a new DateField defaulting to using a short date pattern
         * 
         * @param id
         *            The id of the text field
         * @param datePattern
         *            The pattern to use. Must be not null. See {@link 
SimpleDateFormat} for available
         *            patterns.
-        * @return DateTextField
+        * @return DateField
         */
        public static DateField forDatePattern(String id, String datePattern)
        {
@@ -83,7 +83,7 @@ public class DateField extends TextField<LocalDate> 
implements ITextFormatProvid
        }
 
        /**
-        * Creates a new DateTextField using the provided date style.
+        * Creates a new DateField using the provided date style.
         * 
         * @param id
         *            The id of the text field
@@ -94,16 +94,15 @@ public class DateField extends TextField<LocalDate> 
implements ITextFormatProvid
         *            is the time style. Specify a character of 'S' for short 
style, 'M' for medium, 'L'
         *            for long, and 'F' for full. A date or time may be 
ommitted by specifying a style
         *            character '-'. See {@link 
org.joda.time.DateTimeFormat#forStyle(String)}.
-        * @return DateTextField
+        * @return DateField
         */
        public static DateField forDateStyle(String id, IModel<LocalDate> 
model, String dateStyle)
        {
-               FormatStyle dateFormatStyle = 
parseFormatStyle(dateStyle.charAt(0));
-               return new DateField(id, model, new 
StyleZonedDateTimeConverter(dateStyle, null, false));
+               return new DateField(id, model, new 
StyleDateConverter(dateStyle));
        }
 
        /**
-        * Creates a new DateTextField using the provided date style.
+        * Creates a new DateField using the provided date style.
         * 
         * @param id
         *            The id of the text field
@@ -112,7 +111,7 @@ public class DateField extends TextField<LocalDate> 
implements ITextFormatProvid
         *            is the time style. Specify a character of 'S' for short 
style, 'M' for medium, 'L'
         *            for long, and 'F' for full. A date or time may be 
ommitted by specifying a style
         *            character '-'. See {@link 
org.joda.time.DateTimeFormat#forStyle(String)}.
-        * @return DateTextField
+        * @return DateField
         */
        public static DateField forDateStyle(String id, String dateStyle)
        {
@@ -120,11 +119,11 @@ public class DateField extends TextField<LocalDate> 
implements ITextFormatProvid
        }
 
        /**
-        * Creates a new DateTextField defaulting to using a short date pattern
+        * Creates a new DateField defaulting to using a short date pattern
         * 
         * @param id
         *            The id of the text field
-        * @return DateTextField
+        * @return DateField
         */
        public static DateField forShortStyle(String id)
        {
@@ -132,27 +131,27 @@ public class DateField extends TextField<LocalDate> 
implements ITextFormatProvid
        }
 
        /**
-        * Creates a new DateTextField defaulting to using a short date pattern
+        * Creates a new DateField defaulting to using a short date pattern
         * 
         * @param id
         *            The id of the text field
         * @param model
         *            The model
-        * @return DateTextField
+        * @return DateField
         */
        public static DateField forShortStyle(String id, IModel<LocalDate> 
model)
        {
-               return new DateField(id, model, new 
StyleZonedDateTimeConverter(false));
+               return new DateField(id, model, new StyleDateConverter());
        }
 
        /**
-        * Creates a new DateTextField using the provided converter.
+        * Creates a new DateField using the provided converter.
         * 
         * @param id
         *            The id of the text field
         * @param converter
         *            the date converter
-        * @return DateTextField
+        * @return DateField
         */
        public static DateField withConverter(String id, 
IDateConverter<LocalDate> converter)
        {
@@ -160,7 +159,7 @@ public class DateField extends TextField<LocalDate> 
implements ITextFormatProvid
        }
 
        /**
-        * Creates a new DateTextField using the provided converter.
+        * Creates a new DateField using the provided converter.
         * 
         * @param id
         *            The id of the text field
@@ -168,7 +167,7 @@ public class DateField extends TextField<LocalDate> 
implements ITextFormatProvid
         *            The model
         * @param converter
         *            the date converter
-        * @return DateTextField
+        * @return DateField
         */
        public static DateField withConverter(String id, IModel<LocalDate> 
model, IDateConverter<LocalDate> converter)
        {

http://git-wip-us.apache.org/repos/asf/wicket/blob/2f1b9251/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/DateLabel.java
----------------------------------------------------------------------
diff --git 
a/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/DateLabel.java
 
b/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/DateLabel.java
index 957e53e..1f8531a 100644
--- 
a/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/DateLabel.java
+++ 
b/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/DateLabel.java
@@ -64,7 +64,7 @@ public class DateLabel extends Label implements 
IGenericComponent<LocalDate, Dat
         */
        public static DateLabel forDatePattern(String id, IModel<LocalDate> 
model, String datePattern)
        {
-               return new DateLabel(id, model, new 
PatternDateConverter(datePattern, true));
+               return new DateLabel(id, model, new 
PatternZonedDateTimeConverter(datePattern, true));
        }
 
        /**

http://git-wip-us.apache.org/repos/asf/wicket/blob/2f1b9251/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/DateTimeField.html
----------------------------------------------------------------------
diff --git 
a/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/DateTimeField.html
 
b/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/DateTimeField.html
index 8bcd43b..d92f2ce 100644
--- 
a/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/DateTimeField.html
+++ 
b/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/DateTimeField.html
@@ -18,9 +18,6 @@
 <wicket:panel xmlns:wicket="http://wicket.apache.org";>
   <span style="white-space: nowrap;">
     <input type="text" wicket:id="date" size="12" />
-    <input type="text" wicket:id="hours" size="2" maxlength="2" />
-    <span wicket:id="hoursSeparator">&#160;:</span>
-    <input type="text" wicket:id="minutes" size="2" maxlength="2" />
-    <select wicket:id="amOrPmChoice"></select>
+    <span wicket:id="time" />
   </span>
 </wicket:panel>

http://git-wip-us.apache.org/repos/asf/wicket/blob/2f1b9251/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/DateTimeField.java
----------------------------------------------------------------------
diff --git 
a/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/DateTimeField.java
 
b/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/DateTimeField.java
index eff009a..200129f 100644
--- 
a/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/DateTimeField.java
+++ 
b/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/DateTimeField.java
@@ -16,33 +16,21 @@
  */
 package org.apache.wicket.extensions.markup.html.form.datetime;
 
-import java.text.DecimalFormat;
-import java.text.NumberFormat;
 import java.time.LocalDate;
 import java.time.LocalTime;
 import java.time.ZoneId;
 import java.time.ZonedDateTime;
 import java.time.temporal.ChronoField;
-import java.util.Arrays;
-import java.util.Calendar;
 import java.util.Date;
 import java.util.Locale;
-import java.util.Map;
 import java.util.TimeZone;
 
 import org.apache.wicket.Session;
 import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior;
 import org.apache.wicket.core.request.ClientInfo;
-import org.apache.wicket.markup.html.WebMarkupContainer;
-import org.apache.wicket.markup.html.form.DropDownChoice;
 import org.apache.wicket.markup.html.form.FormComponentPanel;
-import org.apache.wicket.markup.html.form.TextField;
 import org.apache.wicket.model.IModel;
-import org.apache.wicket.model.Model;
 import org.apache.wicket.protocol.http.request.WebClientInfo;
-import org.apache.wicket.util.convert.IConverter;
-import org.apache.wicket.util.convert.converter.IntegerConverter;
-import org.apache.wicket.validation.validator.RangeValidator;
 
 /**
  * Works on a {@link java.time.ZonedDateTime} object. Displays a date field 
and a DatePicker, a field
@@ -77,64 +65,18 @@ import 
org.apache.wicket.validation.validator.RangeValidator;
  */
 public class DateTimeField extends FormComponentPanel<ZonedDateTime>
 {
-       /**
-        * Enumerated type for different ways of handling the render part of 
requests.
-        */
-       public enum AM_PM {
-               /** */
-               AM("AM"),
-
-               /** */
-               PM("PM");
-
-               private  final String value;
-
-               AM_PM(final String name)
-               {
-                       value = name;
-               }
-
-               @Override
-               public String toString()
-               {
-                       return value;
-               }
-       }
-
        private static final long serialVersionUID = 1L;
 
        // Component-IDs
        protected static final String DATE = "date";
-       protected static final String HOURS = "hours";
-       protected static final String MINUTES = "minutes";
-       protected static final String AM_OR_PM_CHOICE = "amOrPmChoice";
-
-       // PropertyModel string to access getAmOrPm
-       private static final String AM_OR_PM = "amOrPm";
-
-       private static final IConverter<Integer> MINUTES_CONVERTER = new 
IntegerConverter() {
-               private static final long serialVersionUID = 1L;
-
-               protected NumberFormat newNumberFormat(Locale locale) {
-                       return new DecimalFormat("00");
-               }
-       };
-
-       // The dropdown list for AM/PM and it's associated model object
-       private DropDownChoice<AM_PM> amOrPmChoice;
-       private AM_PM amOrPm = AM_PM.AM;
+       protected static final String TIME = "time";
 
        // The date TextField and it's associated model object
        // Note that any time information in date will be ignored
        private DateField dateField;
+       private TimeField timeField;
        private ZonedDateTime dateTime = ZonedDateTime.now();
 
-       // The TextField for "hours" and it's associated model object
-       private TextField<Integer> hoursField;
-
-       // The TextField for "minutes" and it's associated model object
-       private TextField<Integer> minutesField;
-
        /**
         * Construct.
         * 
@@ -156,121 +98,29 @@ public class DateTimeField extends 
FormComponentPanel<ZonedDateTime>
                super(id, model);
 
                // Sets the type that will be used when updating the model for 
this component.
-               setType(Date.class);
+               setType(ZonedDateTime.class);
 
                // Create and add the date TextField
-               add(dateField = newDateTextField(DATE, new DateModel()));
-
-               // Add a date picker to the date TextField
-//             dateField.add(newDatePicker());
-
-               // Create and add the "hours" TextField
-               add(hoursField = newHoursTextField(HOURS, new HoursModel(), 
Integer.class));
-
-               // Create and add the "minutes" TextField
-               add(minutesField = newMinutesTextField(MINUTES, new 
MinutesModel(), Integer.class));
-
-               // Create and add the "AM/PM" Listbox
-               add(amOrPmChoice = new DropDownChoice<>(AM_OR_PM_CHOICE, new 
AmPmModel(), Arrays.asList(AM_PM.values())));
-
-               add(new WebMarkupContainer("hoursSeparator")
-               {
-                       private static final long serialVersionUID = 1L;
-
-                       @Override
-                       public boolean isVisible()
-                       {
-                               return minutesField.determineVisibility();
-                       }
-               });
-       }
-
-       /**
-        * create a new {@link TextField} instance for hours to be added to 
this panel.
-        * 
-        * @param id
-        *            the component id
-        * @param model
-        *            model that should be used by the {@link TextField}
-        * @param type
-        *            the type of the text field
-        * @return a new text field instance
-        */
-       protected TextField<Integer> newHoursTextField(final String id, 
IModel<Integer> model, Class<Integer> type) {
-               TextField<Integer> hoursTextField = new TextField<>(id, model, 
type);
-               hoursTextField.add(getMaximumHours() == 24 ? 
RangeValidator.range(0, 23) : RangeValidator
-                       .range(1, 12));
-               hoursTextField.setLabel(new Model<>(HOURS));
-               return hoursTextField;
-       }
-
-       /**
-        * create a new {@link TextField} instance for minutes to be added to 
this panel.
-        *
-        * @param id
-        *            the component id
-        * @param model
-        *            model that should be used by the {@link TextField}
-        * @param type
-        *            the type of the text field
-        * @return a new text field instance
-        */
-       protected TextField<Integer> newMinutesTextField(final String id, 
IModel<Integer> model,
-               Class<Integer> type)
-       {
-               TextField<Integer> minutesField = new TextField<Integer>(id, 
model, type)
-               {
-                       private static final long serialVersionUID = 1L;
-
-                       @Override
-                       protected IConverter<?> createConverter(Class<?> type)
-                       {
-                               if (Integer.class.isAssignableFrom(type))
-                               {
-                                       return MINUTES_CONVERTER;
-                               }
-                               return null;
-                       }
-               };
-               minutesField.add(new RangeValidator<>(0, 59));
-               minutesField.setLabel(new Model<>(MINUTES));
-               return minutesField;
+               add(dateField = newDateField(DATE, new DateModel()));
+               add(timeField = newTimeField(TIME, new TimeModel()));
        }
 
        /**
         * 
         * @return The date TextField
         */
-       protected final DateField getDateTextField()
+       protected final DateField getDateField()
        {
                return dateField;
        }
 
        /**
-        * Gets the amOrPm model object of the drop down choice.
         * 
-        * @return amOrPm
-        * 
-        * @deprecated valid during rendering only
-        */
-       public final AM_PM getAmOrPm()
-       {
-               return amOrPm;
-       }
-
-       /**
-        * Gives overriding classes the option of adding (or even changing/ 
removing) configuration
-        * properties for the javascript widget. See <a
-        * href="http://developer.yahoo.com/yui/calendar/";>the widget's 
documentation</a> for the
-        * available options. If you want to override/ remove properties, you 
should call
-        * super.configure(properties) first. If you don't call that, be aware 
that you will have to
-        * call {@link #configure(java.util.Map)} manually if you like 
localized strings to be added.
-        * 
-        * @param widgetProperties
-        *            the current widget properties
+        * @return The date TextField
         */
-       protected void configure(Map<String, Object> widgetProperties)
+       protected final TimeField getTimeField()
        {
+               return timeField;
        }
 
        @Override
@@ -278,18 +128,7 @@ public class DateTimeField extends 
FormComponentPanel<ZonedDateTime>
        {
                // since we override convertInput, we can let this method 
return a value
                // that is just suitable for error reporting
-               return dateField.getInput() + ", " + hoursField.getInput() + 
":" + minutesField.getInput();
-       }
-
-       /**
-        * Sets the amOrPm model object associated with the drop down choice.
-        * 
-        * @param amOrPm
-        *            amOrPm
-        */
-       public final void setAmOrPm(final AM_PM amOrPm)
-       {
-               this.amOrPm = amOrPm;
+               return String.format("%s, %s", dateField.getInput(), 
timeField.getInput());
        }
 
        /**
@@ -324,27 +163,16 @@ public class DateTimeField extends 
FormComponentPanel<ZonedDateTime>
                try
                {
                        // Get the converted input values
-                       LocalDate dateFieldInput = 
dateField.getConvertedInput();
-                       Integer hoursInput = hoursField.getConvertedInput();
-                       Integer minutesInput = minutesField.getConvertedInput();
-                       AM_PM amOrPmInput = amOrPmChoice.getConvertedInput();
+                       LocalDate localDate = dateField.getConvertedInput();
 
-                       if (dateFieldInput == null)
+                       if (localDate == null)
                        {
                                return;
                        }
 
                        // Use the input to create a date object with proper 
timezone
-                       LocalTime localTime = LocalTime.of(hoursInput, 
minutesInput);
-                       ZonedDateTime date = ZonedDateTime.of(dateFieldInput, 
localTime, getClientTimeZone());
-
-                       // Adjust for halfday if needed
-                       if (use12HourFormat())
-                       {
-                               int halfday = (amOrPmInput == AM_PM.PM ? 1 : 0);
-                               date = date.with(ChronoField.AMPM_OF_DAY, 
halfday);
-//                             date = date.with(ChronoField.HOUR_OF_AMPM, 
hours % 12);
-                       }
+                       LocalTime localTime = timeField.getConvertedInput();
+                       ZonedDateTime date = ZonedDateTime.of(localDate, 
localTime, getClientTimeZone());
 
                        // The date will be in the server's timezone
                        setConvertedInput(date);
@@ -357,39 +185,31 @@ public class DateTimeField extends 
FormComponentPanel<ZonedDateTime>
        }
 
        /**
-        * A factory method for the DateTextField's model object.
-        * 
-        * @return any specialization of java.util.Date
-        */
-       protected LocalDate newDateInstance()
-       {
-               return LocalDate.now();
-       }
-
-       /**
-        * A factory method for the DateTextField's model object.
+        * create a new {@link DateField} instance to be added to this panel.
         * 
-        * @param time
-        *            the time in milliseconds
-        * @return any specialization of java.util.Date
+        * @param id
+        *            the component id
+        * @param dateFieldModel
+        *            model that should be used by the {@link DateField}
+        * @return a new date text field instance
         */
-       protected Date newDateInstance(long time)
+       protected DateField newDateField(String id, IModel<LocalDate> 
dateFieldModel)
        {
-               return new Date(time);
+               return DateField.forShortStyle(id, dateFieldModel);
        }
 
        /**
-        * create a new {@link DateField} instance to be added to this panel.
+        * create a new {@link TimeField} instance to be added to this panel.
         * 
         * @param id
         *            the component id
-        * @param dateFieldModel
-        *            model that should be used by the {@link DateField}
-        * @return a new date text field instance
+        * @param timeFieldModel
+        *            model that should be used by the {@link TimeField}
+        * @return a new time text field instance
         */
-       protected DateField newDateTextField(String id, IModel<LocalDate> 
dateFieldModel)
+       protected TimeField newTimeField(String id, IModel<LocalTime> 
timeFieldModel)
        {
-               return DateField.forShortStyle(id, dateFieldModel);
+               return TimeField.forShortStyle(id, timeFieldModel);
        }
 
        /**
@@ -399,11 +219,7 @@ public class DateTimeField extends 
FormComponentPanel<ZonedDateTime>
        protected void onBeforeRender()
        {
                dateField.setRequired(isRequired());
-               hoursField.setRequired(isRequired());
-               minutesField.setRequired(isRequired());
-
-               boolean use12HourFormat = use12HourFormat();
-               amOrPmChoice.setVisible(use12HourFormat);
+               timeField.setRequired(isRequired());
 
                ZonedDateTime modelObject = getModelObject();
                if (modelObject == null)
@@ -423,93 +239,6 @@ public class DateTimeField extends 
FormComponentPanel<ZonedDateTime>
                super.onBeforeRender();
        }
 
-       /**
-        * Change a date in another timezone
-        * 
-        * @param date
-        *            The input date.
-        * @param zone
-        *            The target timezone.
-        * @return A new converted date.
-        */
-       public static Date changeTimeZone(Date date, TimeZone zone)
-       {
-               Calendar first = Calendar.getInstance(zone);
-               first.setTimeInMillis(date.getTime());
-
-               Calendar output = Calendar.getInstance();
-               output.set(Calendar.YEAR, first.get(Calendar.YEAR));
-               output.set(Calendar.MONTH, first.get(Calendar.MONTH));
-               output.set(Calendar.DAY_OF_MONTH, 
first.get(Calendar.DAY_OF_MONTH));
-               output.set(Calendar.HOUR_OF_DAY, 
first.get(Calendar.HOUR_OF_DAY));
-               output.set(Calendar.MINUTE, first.get(Calendar.MINUTE));
-               output.set(Calendar.SECOND, first.get(Calendar.SECOND));
-               output.set(Calendar.MILLISECOND, 
first.get(Calendar.MILLISECOND));
-
-               return output.getTime();
-       }
-
-       /**
-        * Checks whether the current {@link Locale} uses the 12h or 24h time 
format. This method can be
-        * overridden to e.g. always use 24h format.
-        * 
-        * @return true, if the current {@link Locale} uses the 12h format.<br/>
-        *         false, otherwise
-        */
-       protected boolean use12HourFormat()
-       {
-               // TODO Fix !
-               return false;
-//             String pattern = DateTimeFormat.patternForStyle("-S", 
getLocale());
-//             return pattern.indexOf('a') != -1 || pattern.indexOf('h') != -1
-//                     || pattern.indexOf('K') != -1;
-       }
-
-       /**
-        * @return either 12 or 24, depending on the hour format of the current 
{@link Locale}
-        */
-       private int getMaximumHours()
-       {
-               return getMaximumHours(use12HourFormat());
-       }
-
-       /**
-        * Convenience method (mainly for optimization purposes), in case 
{@link #use12HourFormat()} has
-        * already been stored in a local variable and thus doesn't need to be 
computed again.
-        * 
-        * @param use12HourFormat
-        *            the hour format to use
-        * @return either 12 or 24, depending on the parameter 
<code>use12HourFormat</code>
-        */
-       private int getMaximumHours(boolean use12HourFormat)
-       {
-               return use12HourFormat ? 12 : 24;
-       }
-//
-//     /**
-//      * The DatePicker that gets added to the DateTimeField component. Users 
may override this method
-//      * with a DatePicker of their choice.
-//      *
-//      * @return a new {@link DatePicker} instance
-//      */
-//     protected DatePicker newDatePicker()
-//     {
-//             return new DatePicker()
-//             {
-//                     private static final long serialVersionUID = 1L;
-//
-//                     @Override
-//                     protected void configure(final Map<String, Object> 
widgetProperties,
-//                             final IHeaderResponse response, final 
Map<String, Object> initVariables)
-//                     {
-//                             super.configure(widgetProperties, response, 
initVariables);
-//
-//                             DateTimeField.this.configure(widgetProperties);
-//                     }
-//             };
-//     }
-
-
        protected class DateModel implements IModel<LocalDate>
        {
                private static final long serialVersionUID = 1L;
@@ -534,42 +263,21 @@ public class DateTimeField extends 
FormComponentPanel<ZonedDateTime>
                }
        }
 
-       protected class HoursModel implements IModel<Integer>
-       {
-               private static final long serialVersionUID = 1L;
-
-               @Override
-               public Integer getObject()
-               {
-                       return dateTime.getHour();
-               }
-
-               @Override
-               public void setObject(Integer hour)
-               {
-                       dateTime = dateTime.with(ChronoField.HOUR_OF_DAY, hour);
-               }
-
-               @Override
-               public void detach()
-               {
-               }
-       }
-
-       protected class MinutesModel implements IModel<Integer>
+       protected class TimeModel implements IModel<LocalTime>
        {
                private static final long serialVersionUID = 1L;
 
                @Override
-               public Integer getObject()
+               public LocalTime getObject()
                {
-                       return dateTime.getMinute();
+                       return dateTime.toLocalTime();
                }
 
                @Override
-               public void setObject(Integer minute)
+               public void setObject(LocalTime time)
                {
-                       dateTime = dateTime.with(ChronoField.MINUTE_OF_HOUR, 
minute);
+                       dateTime = dateTime.with(ChronoField.HOUR_OF_DAY, 
time.getHour());
+                       dateTime = dateTime.with(ChronoField.MINUTE_OF_HOUR, 
time.getMinute());
                }
 
                @Override
@@ -577,29 +285,4 @@ public class DateTimeField extends 
FormComponentPanel<ZonedDateTime>
                {
                }
        }
-
-       protected class AmPmModel implements IModel<AM_PM>
-       {
-               private static final long serialVersionUID = 1L;
-
-               @Override
-               public AM_PM getObject()
-               {
-                       int i = dateTime.get(ChronoField.AMPM_OF_DAY);
-                       return i == 0 ? AM_PM.AM : AM_PM.PM;
-               }
-
-               @Override
-               public void setObject(AM_PM amPm)
-               {
-                       int i = AM_PM.AM == amPm ? 0 : 1;
-                       dateTime = dateTime.with(ChronoField.AMPM_OF_DAY, i);
-               }
-
-               @Override
-               public void detach()
-               {
-               }
-       }
-
 }

http://git-wip-us.apache.org/repos/asf/wicket/blob/2f1b9251/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/LocalDateConverter.java
----------------------------------------------------------------------
diff --git 
a/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/LocalDateConverter.java
 
b/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/LocalDateConverter.java
index 9306d8d..28554bd 100644
--- 
a/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/LocalDateConverter.java
+++ 
b/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/LocalDateConverter.java
@@ -26,7 +26,7 @@ import org.apache.wicket.util.string.Strings;
 
 
 /**
- * Base class for Joda Time based date converters. It contains the logic to 
parse and format,
+ * Base class for java.time based date converters. It contains the logic to 
parse and format,
  * optionally taking the time zone difference between clients and the server 
into account.
  * <p>
  * Converters of this class are best suited for per-component use.

http://git-wip-us.apache.org/repos/asf/wicket/blob/2f1b9251/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/LocalTimeConverter.java
----------------------------------------------------------------------
diff --git 
a/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/LocalTimeConverter.java
 
b/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/LocalTimeConverter.java
new file mode 100644
index 0000000..a10a662
--- /dev/null
+++ 
b/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/LocalTimeConverter.java
@@ -0,0 +1,103 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.wicket.extensions.markup.html.form.datetime;
+
+import java.time.LocalTime;
+import java.time.format.DateTimeFormatter;
+import java.util.Locale;
+
+import org.apache.wicket.util.convert.ConversionException;
+import org.apache.wicket.util.lang.Args;
+import org.apache.wicket.util.string.Strings;
+
+
+/**
+ * Base class for java.time based date converters. It contains the logic to 
parse and format,
+ * optionally taking the time zone difference between clients and the server 
into account.
+ * <p>
+ * Converters of this class are best suited for per-component use.
+ * </p>
+ * 
+ * @author eelcohillenius
+ */
+public abstract class LocalTimeConverter implements IDateConverter<LocalTime>
+{
+       private static final long serialVersionUID = 1L;
+
+       public LocalTime convertToObject(String value, DateTimeFormatter 
format, Locale locale) {
+               try
+               {
+                       // parse date retaining the time of the submission
+                       return LocalTime.parse(value, format);
+               }
+               catch (RuntimeException e)
+               {
+                       throw newConversionException(e, locale);
+               }
+       }
+
+       @Override
+       public LocalTime convertToObject(String value, Locale locale)
+       {
+               if (Strings.isEmpty(value))
+               {
+                       return null;
+               }
+
+               DateTimeFormatter format = getFormat(locale);
+               Args.notNull(format, "format");
+
+               return convertToObject(value, format, locale);
+       }
+
+       /**
+        * Creates a ConversionException and sets additional context 
information to it.
+        *
+        * @param cause
+        *            - {@link RuntimeException} cause
+        * @param locale
+        *            - {@link Locale} used to set 'format' variable with 
localized pattern
+        * @return {@link ConversionException}
+        */
+       ConversionException newConversionException(RuntimeException cause, 
Locale locale)
+       {
+               return new ConversionException(cause)
+                               .setVariable("format", getPattern(locale));
+       }
+
+       @Override
+       public String convertToString(LocalTime time, Locale locale)
+       {
+               DateTimeFormatter format = getFormat(locale);
+               return format.format(time);
+       }
+
+       /**
+        * @param locale
+        *            The locale used to convert the value
+        * @return Gets the pattern that is used for printing and parsing
+        */
+       public abstract String getPattern(Locale locale);
+
+       /**
+        * @param locale
+        *            The locale used to convert the value
+        * 
+        * @return formatter The formatter for the current conversion
+        */
+       public abstract DateTimeFormatter getFormat(Locale locale);
+}

http://git-wip-us.apache.org/repos/asf/wicket/blob/2f1b9251/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/PatternDateConverter.java
----------------------------------------------------------------------
diff --git 
a/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/PatternDateConverter.java
 
b/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/PatternDateConverter.java
index e2b714f..54ea179 100644
--- 
a/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/PatternDateConverter.java
+++ 
b/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/PatternDateConverter.java
@@ -24,7 +24,7 @@ import org.apache.wicket.util.lang.Args;
 
 
 /**
- * Date converter that uses Joda Time and can be configured to take the time 
zone difference between
+ * Date converter that uses javax.time and can be configured to take the time 
zone difference between
  * clients and server into account. This converter is hard coded to use the 
provided custom date
  * pattern, no matter what current locale is used. See {@link 
SimpleDateFormat} for available
  * patterns.
@@ -33,15 +33,14 @@ import org.apache.wicket.util.lang.Args;
  * </p>
  * 
  * @see SimpleDateFormat
- * @see StyleZonedDateTimeConverter
+ * @see StyleDateConverter
  * @see org.apache.wicket.extensions.markup.html.form.DateTextField
- * @see java.time.ZonedDateTime
+ * @see java.time.LocalDate
  * @see DateTimeFormatter
- * @see java.time.ZoneId
  * 
  * @author eelcohillenius
  */
-public class PatternDateConverter extends ZonedDateTimeConverter
+public class PatternDateConverter extends LocalDateConverter
 {
 
        private static final long serialVersionUID = 1L;
@@ -51,27 +50,16 @@ public class PatternDateConverter extends 
ZonedDateTimeConverter
 
        /**
         * Construct.
-        * </p>
-        * When applyTimeZoneDifference is true, the current time is applied on 
the parsed date, and the
-        * date will be corrected for the time zone difference between the 
server and the client. For
-        * instance, if I'm in Seattle and the server I'm working on is in 
Amsterdam, the server is 9
-        * hours ahead. So, if I'm inputting say 12/24 at a couple of hours 
before midnight, at the
-        * server it is already 12/25. If this boolean is true, it will be 
transformed to 12/25, while
-        * the client sees 12/24.
-        * </p>
         * 
         * @param datePattern
         *            The pattern to use. Must be not null. See {@link 
SimpleDateFormat} for available
         *            patterns.
-        * @param applyTimeZoneDifference
-        *            whether to apply the difference in time zones between 
client and server
         * @throws IllegalArgumentException
         *             in case the date pattern is null
         */
-       public PatternDateConverter(String datePattern, boolean 
applyTimeZoneDifference)
+       public PatternDateConverter(String datePattern)
        {
-
-               super(applyTimeZoneDifference);
+               super();
                this.datePattern = Args.notNull(datePattern, "datePattern");
        }
 

http://git-wip-us.apache.org/repos/asf/wicket/blob/2f1b9251/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/PatternTimeConverter.java
----------------------------------------------------------------------
diff --git 
a/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/PatternTimeConverter.java
 
b/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/PatternTimeConverter.java
new file mode 100644
index 0000000..021f500
--- /dev/null
+++ 
b/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/PatternTimeConverter.java
@@ -0,0 +1,85 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.wicket.extensions.markup.html.form.datetime;
+
+import java.text.SimpleDateFormat;
+import java.time.format.DateTimeFormatter;
+import java.util.Locale;
+
+import org.apache.wicket.util.lang.Args;
+
+
+/**
+ * Date converter that uses javax.time and can be configured to take the time 
zone difference between
+ * clients and server into account. This converter is hard coded to use the 
provided custom date
+ * pattern, no matter what current locale is used. See {@link 
SimpleDateFormat} for available
+ * patterns.
+ * <p>
+ * This converter is especially suited on a per-component base.
+ * </p>
+ * 
+ * @see SimpleDateFormat
+ * @see StyleDateConverter
+ * @see org.apache.wicket.extensions.markup.html.form.DateTextField
+ * @see java.time.LocalTime
+ * @see DateTimeFormatter
+ * 
+ * @author eelcohillenius
+ */
+public class PatternTimeConverter extends LocalTimeConverter
+{
+
+       private static final long serialVersionUID = 1L;
+
+       /** pattern to use. */
+       private final String timePattern;
+
+       /**
+        * Construct.
+        * 
+        * @param timePattern
+        *            The pattern to use. Must be not null. See {@link 
SimpleDateFormat} for available
+        *            patterns.
+        * @throws IllegalArgumentException
+        *             in case the date pattern is null
+        */
+       public PatternTimeConverter(String timePattern)
+       {
+               super();
+               this.timePattern = Args.notNull(timePattern, "timePattern");
+       }
+
+       /**
+        * Gets the optional date pattern.
+        * 
+        * @return datePattern
+        */
+       @Override
+       public final String getPattern(Locale locale)
+       {
+               return timePattern;
+       }
+
+       /**
+        * @return formatter The formatter for the current conversion
+        */
+       @Override
+       public DateTimeFormatter getFormat(Locale locale)
+       {
+               return 
DateTimeFormatter.ofPattern(timePattern).withLocale(locale);
+       }
+}

http://git-wip-us.apache.org/repos/asf/wicket/blob/2f1b9251/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/PatternZonedDateTimeConverter.java
----------------------------------------------------------------------
diff --git 
a/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/PatternZonedDateTimeConverter.java
 
b/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/PatternZonedDateTimeConverter.java
new file mode 100644
index 0000000..c432d90
--- /dev/null
+++ 
b/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/PatternZonedDateTimeConverter.java
@@ -0,0 +1,97 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.wicket.extensions.markup.html.form.datetime;
+
+import java.text.SimpleDateFormat;
+import java.time.format.DateTimeFormatter;
+import java.util.Locale;
+
+import org.apache.wicket.util.lang.Args;
+
+
+/**
+ * Date converter that uses javax.time and can be configured to take the time 
zone difference between
+ * clients and server into account. This converter is hard coded to use the 
provided custom date
+ * pattern, no matter what current locale is used. See {@link 
SimpleDateFormat} for available
+ * patterns.
+ * <p>
+ * This converter is especially suited on a per-component base.
+ * </p>
+ * 
+ * @see SimpleDateFormat
+ * @see StyleZonedDateTimeConverter
+ * @see org.apache.wicket.extensions.markup.html.form.DateTextField
+ * @see java.time.ZonedDateTime
+ * @see DateTimeFormatter
+ * @see java.time.ZoneId
+ * 
+ * @author eelcohillenius
+ */
+public class PatternZonedDateTimeConverter extends ZonedDateTimeConverter
+{
+
+       private static final long serialVersionUID = 1L;
+
+       /** pattern to use. */
+       private final String datePattern;
+
+       /**
+        * Construct.
+        * </p>
+        * When applyTimeZoneDifference is true, the current time is applied on 
the parsed date, and the
+        * date will be corrected for the time zone difference between the 
server and the client. For
+        * instance, if I'm in Seattle and the server I'm working on is in 
Amsterdam, the server is 9
+        * hours ahead. So, if I'm inputting say 12/24 at a couple of hours 
before midnight, at the
+        * server it is already 12/25. If this boolean is true, it will be 
transformed to 12/25, while
+        * the client sees 12/24.
+        * </p>
+        * 
+        * @param datePattern
+        *            The pattern to use. Must be not null. See {@link 
SimpleDateFormat} for available
+        *            patterns.
+        * @param applyTimeZoneDifference
+        *            whether to apply the difference in time zones between 
client and server
+        * @throws IllegalArgumentException
+        *             in case the date pattern is null
+        */
+       public PatternZonedDateTimeConverter(String datePattern, boolean 
applyTimeZoneDifference)
+       {
+
+               super(applyTimeZoneDifference);
+               this.datePattern = Args.notNull(datePattern, "datePattern");
+       }
+
+       /**
+        * Gets the optional date pattern.
+        * 
+        * @return datePattern
+        */
+       @Override
+       public final String getPattern(Locale locale)
+       {
+               return datePattern;
+       }
+
+       /**
+        * @return formatter The formatter for the current conversion
+        */
+       @Override
+       public DateTimeFormatter getFormat(Locale locale)
+       {
+               return 
DateTimeFormatter.ofPattern(datePattern).withLocale(locale);
+       }
+}

http://git-wip-us.apache.org/repos/asf/wicket/blob/2f1b9251/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/StyleDateConverter.java
----------------------------------------------------------------------
diff --git 
a/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/StyleDateConverter.java
 
b/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/StyleDateConverter.java
index 14e6d22..79decad 100644
--- 
a/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/StyleDateConverter.java
+++ 
b/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/StyleDateConverter.java
@@ -17,7 +17,6 @@
 package org.apache.wicket.extensions.markup.html.form.datetime;
 
 import java.time.LocalDate;
-import java.time.ZonedDateTime;
 import java.time.chrono.IsoChronology;
 import java.time.format.DateTimeFormatter;
 import java.time.format.DateTimeFormatterBuilder;
@@ -25,7 +24,7 @@ import java.time.format.FormatStyle;
 import java.util.Locale;
 
 /**
- * Date converter that uses Joda Time and can be configured to take the time 
zone difference between
+ * Date converter that uses javax.time and can be configured to take the time 
zone difference between
  * clients and server into account, and that is configured for a certain date 
style. The pattern
  * will always be locale specific.
  * <p>
@@ -33,9 +32,8 @@ import java.util.Locale;
  * </p>
  * 
  * @see org.apache.wicket.extensions.markup.html.form.DateTextField
- * @see java.time.ZonedDateTime
+ * @see java.time.LocalDate
  * @see DateTimeFormatter
- * @see java.time.ZoneId
  * 
  * @author eelcohillenius
  */
@@ -60,33 +58,22 @@ public class StyleDateConverter extends LocalDateConverter
 
        /**
         * Construct. The provided pattern will be used as the base format (but 
they will be localized
-        * for the current locale) and if null, {@link 
DateTimeFormatter#ofLocalizedDate(FormatStyle)} will be used. </p>
-        * When applyTimeZoneDifference is true, the current time is applied on 
the parsed date, and the
-        * date will be corrected for the time zone difference between the 
server and the client. For
-        * instance, if I'm in Seattle and the server I'm working on is in 
Amsterdam, the server is 9
-        * hours ahead. So, if I'm inputting say 12/24 at a couple of hours 
before midnight, at the
-        * server it is already 12/25. If this boolean is true, it will be 
transformed to 12/25, while
-        * the client sees 12/24. </p>
+        * for the current locale) and if null, {@link 
DateTimeFormatter#ofLocalizedDate(FormatStyle)} will be used.
         * 
         * @param dateStyle
         *            Date style to use. See {@link 
DateTimeFormatter#ofLocalizedDate(FormatStyle)}.
-        * @param timeStyle
-        *            Time style to use. See {@link 
DateTimeFormatter#ofLocalizedTime(FormatStyle)}
-        * @param applyTimeZoneDifference
-        *            whether to apply the difference in time zones between 
client and server
         * @throws IllegalArgumentException
         *             in case dateStyle is null
         */
-       public StyleDateConverter(FormatStyle dateStyle, FormatStyle timeStyle, 
boolean applyTimeZoneDifference)
+       public StyleDateConverter(FormatStyle dateStyle)
        {
-               super(applyTimeZoneDifference);
+               super();
                this.dateStyle = dateStyle;
-               this.timeStyle = timeStyle;
        }
 
-       public StyleDateConverter(String dateTimeStyle, boolean 
applyTimeZoneDifference)
+       public StyleDateConverter(String dateStyle)
        {
-               this(parseFormatStyle(dateTimeStyle.charAt(0)), 
parseFormatStyle(dateTimeStyle.charAt(1)), applyTimeZoneDifference);
+               this(parseFormatStyle(dateStyle.charAt(0)));
        }
 
        /**
@@ -97,8 +84,7 @@ public class StyleDateConverter extends LocalDateConverter
        @Override
        public final String getPattern(Locale locale)
        {
-               String localizedDateTimePattern = 
DateTimeFormatterBuilder.getLocalizedDateTimePattern(dateStyle, timeStyle, 
IsoChronology.INSTANCE, locale);
-               return localizedDateTimePattern;
+               return 
DateTimeFormatterBuilder.getLocalizedDateTimePattern(dateStyle, null, 
IsoChronology.INSTANCE, locale);
        }
 
        /**
@@ -107,23 +93,7 @@ public class StyleDateConverter extends LocalDateConverter
        @Override
        public DateTimeFormatter getFormat(Locale locale)
        {
-               DateTimeFormatter df = null;
-               if (dateStyle == null && timeStyle == null) {
-                       return df;
-               }
-               if (timeStyle == null)
-               {
-                       df = DateTimeFormatter.ofLocalizedDate(dateStyle);
-               }
-               else if (dateStyle == null)
-               {
-                       df = DateTimeFormatter.ofLocalizedTime(timeStyle);
-               }
-               else
-               {
-                       df = DateTimeFormatter.ofLocalizedDateTime(dateStyle, 
timeStyle);
-               }
-               return df.withLocale(locale);
+               return dateStyle == null ? null : 
DateTimeFormatter.ofLocalizedDate(dateStyle).withLocale(locale);
        }
 
        public static FormatStyle parseFormatStyle(char style)
@@ -132,23 +102,13 @@ public class StyleDateConverter extends LocalDateConverter
        }
 
        @Override
-       public ZonedDateTime convertToObject(String value, DateTimeFormatter 
format, Locale locale) {
+       public LocalDate convertToObject(String value, DateTimeFormatter 
format, Locale locale) {
                if (format == null) {
                        return null;
                }
                try
                {
-                       if (timeStyle == null)
-                       {
-                               LocalDate d = LocalDate.parse(value, format);
-                               return ZonedDateTime.of(d.atStartOfDay(), 
getTimeZone());
-                       }
-                       else if (dateStyle == null)
-                       {
-                               // not sure how we can get ZonedDateTime from 
time
-                               return null;
-                       }
-                       return super.convertToObject(value, format, locale);
+                       return LocalDate.parse(value, format);
                }
                catch (RuntimeException e)
                {

http://git-wip-us.apache.org/repos/asf/wicket/blob/2f1b9251/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/StyleTimeConverter.java
----------------------------------------------------------------------
diff --git 
a/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/StyleTimeConverter.java
 
b/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/StyleTimeConverter.java
new file mode 100644
index 0000000..8ac59b4
--- /dev/null
+++ 
b/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/StyleTimeConverter.java
@@ -0,0 +1,118 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.wicket.extensions.markup.html.form.datetime;
+
+import java.time.LocalTime;
+import java.time.chrono.IsoChronology;
+import java.time.format.DateTimeFormatter;
+import java.time.format.DateTimeFormatterBuilder;
+import java.time.format.FormatStyle;
+import java.util.Locale;
+
+/**
+ * Date converter that uses javax.time and can be configured to take the time 
zone difference between
+ * clients and server into account, and that is configured for a certain date 
style. The pattern
+ * will always be locale specific.
+ * <p>
+ * This converter is especially suited on a per-component base.
+ * </p>
+ * 
+ * @see org.apache.wicket.extensions.markup.html.form.DateTextField
+ * @see java.time.LocalTime
+ * @see DateTimeFormatter
+ * 
+ * @author eelcohillenius
+ */
+public class StyleTimeConverter extends LocalTimeConverter
+{
+       private static final long serialVersionUID = 1L;
+
+       /**
+        * Date style to use. See {@link 
DateTimeFormatter#ofLocalizedDate(FormatStyle)}.
+        */
+       private final FormatStyle timeStyle;
+
+       /**
+        * Construct. The dateStyle 'S-' (which is the same as {@link 
DateTimeFormatter#ofLocalizedDate(FormatStyle)}) will
+        * be used for constructing the date format for the current locale.
+        * 
+        */
+       public StyleTimeConverter()
+       {
+               this(FormatStyle.SHORT);
+       }
+
+       /**
+        * Construct. The provided pattern will be used as the base format (but 
they will be localized
+        * for the current locale) and if null, {@link 
DateTimeFormatter#ofLocalizedDate(FormatStyle)} will be used.
+        * 
+        * @param timeStyle
+        *            Date style to use. See {@link 
DateTimeFormatter#ofLocalizedDate(FormatStyle)}.
+        * @throws IllegalArgumentException
+        *             in case dateStyle is null
+        */
+       public StyleTimeConverter(FormatStyle timeStyle)
+       {
+               super();
+               this.timeStyle = timeStyle;
+       }
+
+       public StyleTimeConverter(String timeStyle)
+       {
+               this(parseFormatStyle(timeStyle.charAt(0)));
+       }
+
+       /**
+        * Gets the optional time pattern.
+        * 
+        * @return timePattern
+        */
+       @Override
+       public final String getPattern(Locale locale)
+       {
+               return 
DateTimeFormatterBuilder.getLocalizedDateTimePattern(null, timeStyle, 
IsoChronology.INSTANCE, locale);
+       }
+
+       /**
+        * @return formatter The formatter for the current conversion
+        */
+       @Override
+       public DateTimeFormatter getFormat(Locale locale)
+       {
+               return timeStyle == null ? null : 
DateTimeFormatter.ofLocalizedDate(timeStyle).withLocale(locale);
+       }
+
+       public static FormatStyle parseFormatStyle(char style)
+       {
+               return DateField.parseFormatStyle(style);
+       }
+
+       @Override
+       public LocalTime convertToObject(String value, DateTimeFormatter 
format, Locale locale) {
+               if (format == null) {
+                       return null;
+               }
+               try
+               {
+                       return LocalTime.parse(value, format);
+               }
+               catch (RuntimeException e)
+               {
+                       throw newConversionException(e, locale);
+               }
+       }
+}

http://git-wip-us.apache.org/repos/asf/wicket/blob/2f1b9251/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/StyleZonedDateTimeConverter.java
----------------------------------------------------------------------
diff --git 
a/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/StyleZonedDateTimeConverter.java
 
b/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/StyleZonedDateTimeConverter.java
index cb0f5be..c186cfe 100644
--- 
a/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/StyleZonedDateTimeConverter.java
+++ 
b/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/StyleZonedDateTimeConverter.java
@@ -25,7 +25,7 @@ import java.time.format.FormatStyle;
 import java.util.Locale;
 
 /**
- * Date converter that uses Joda Time and can be configured to take the time 
zone difference between
+ * Date converter that uses javax.time and can be configured to take the time 
zone difference between
  * clients and server into account, and that is configured for a certain date 
style. The pattern
  * will always be locale specific.
  * <p>

http://git-wip-us.apache.org/repos/asf/wicket/blob/2f1b9251/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/TimeField.html
----------------------------------------------------------------------
diff --git 
a/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/TimeField.html
 
b/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/TimeField.html
new file mode 100644
index 0000000..82cb00d
--- /dev/null
+++ 
b/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/TimeField.html
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!--
+   Licensed to the Apache Software Foundation (ASF) under one or more
+   contributor license agreements.  See the NOTICE file distributed with
+   this work for additional information regarding copyright ownership.
+   The ASF licenses this file to You under the Apache License, Version 2.0
+   (the "License"); you may not use this file except in compliance with
+   the License.  You may obtain a copy of the License at
+
+        http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+-->
+<wicket:panel xmlns:wicket="http://wicket.apache.org";>
+  <span style="white-space: nowrap;">
+    <input type="number" wicket:id="hours" size="2" maxlength="2" />
+    <span wicket:id="hoursSeparator">&#160;:</span>
+    <input type="number" wicket:id="minutes" size="2" maxlength="2" />
+    <select wicket:id="amOrPmChoice"></select>
+  </span>
+</wicket:panel>

http://git-wip-us.apache.org/repos/asf/wicket/blob/2f1b9251/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/TimeField.java
----------------------------------------------------------------------
diff --git 
a/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/TimeField.java
 
b/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/TimeField.java
index aa0dea8..cf3cc29 100644
--- 
a/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/TimeField.java
+++ 
b/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/TimeField.java
@@ -16,10 +16,28 @@
  */
 package org.apache.wicket.extensions.markup.html.form.datetime;
 
-import java.time.ZonedDateTime;
+import java.text.DecimalFormat;
+import java.text.NumberFormat;
+import java.text.SimpleDateFormat;
+import java.time.LocalTime;
+import java.time.chrono.IsoChronology;
+import java.time.format.DateTimeFormatterBuilder;
+import java.time.format.FormatStyle;
+import java.time.temporal.ChronoField;
+import java.util.Arrays;
 import java.util.Locale;
 
+import org.apache.wicket.markup.html.WebMarkupContainer;
+import 
org.apache.wicket.markup.html.form.AbstractTextComponent.ITextFormatProvider;
+import org.apache.wicket.markup.html.form.DropDownChoice;
+import org.apache.wicket.markup.html.form.FormComponentPanel;
+import org.apache.wicket.markup.html.form.TextField;
 import org.apache.wicket.model.IModel;
+import org.apache.wicket.model.Model;
+import org.apache.wicket.util.convert.IConverter;
+import org.apache.wicket.util.convert.converter.IntegerConverter;
+import org.apache.wicket.util.lang.Args;
+import org.apache.wicket.validation.validator.RangeValidator;
 
 /**
  * Works on a {@link java.util.Date} object. Displays a field for hours and a 
field for minutes, and
@@ -28,21 +46,195 @@ import org.apache.wicket.model.IModel;
  * {@link TimeField#use12HourFormat}).
  * 
  * @author eelcohillenius
- * @see DateField for a variant with just the date field and date picker
+ * @see TimeField for a variant with just the date field and date picker
  */
-public class TimeField extends DateTimeField
+public class TimeField extends FormComponentPanel<LocalTime> implements 
ITextFormatProvider
 {
        private static final long serialVersionUID = 1L;
 
        /**
+        * Enumerated type for different ways of handling the render part of 
requests.
+        */
+       public enum AM_PM {
+               /** */
+               AM("AM"),
+
+               /** */
+               PM("PM");
+
+               private  final String value;
+
+               AM_PM(final String name)
+               {
+                       value = name;
+               }
+
+               @Override
+               public String toString()
+               {
+                       return value;
+               }
+       }
+       protected static final String HOURS = "hours";
+       protected static final String MINUTES = "minutes";
+       protected static final String AM_OR_PM_CHOICE = "amOrPmChoice";
+
+       private static final IConverter<Integer> MINUTES_CONVERTER = new 
IntegerConverter() {
+               private static final long serialVersionUID = 1L;
+
+               protected NumberFormat newNumberFormat(Locale locale) {
+                       return new DecimalFormat("00");
+               }
+       };
+
+       // The TextField for "hours" and it's associated model object
+       private TextField<Integer> hoursField;
+
+       // The TextField for "minutes" and it's associated model object
+       private TextField<Integer> minutesField;
+
+       // The dropdown list for AM/PM and it's associated model object
+       private DropDownChoice<AM_PM> amOrPmChoice;
+       private LocalTime time = LocalTime.now();
+
+       /**
+        * Creates a new TimeField defaulting to using a short date pattern
+        * 
+        * @param id
+        *            The id of the text field
+        * @param model
+        *            The model
+        * @param timePattern
+        *            The pattern to use. Must be not null. See {@link 
SimpleDateFormat} for available
+        *            patterns.
+        * @return TimeField
+        */
+       public static TimeField forTimePattern(String id, IModel<LocalTime> 
model, String timePattern)
+       {
+               return new TimeField(id, model, new 
PatternTimeConverter(timePattern));
+       }
+
+       /**
+        * Creates a new TimeField defaulting to using a short date pattern
+        * 
+        * @param id
+        *            The id of the text field
+        * @param timePattern
+        *            The pattern to use. Must be not null. See {@link 
SimpleDateFormat} for available
+        *            patterns.
+        * @return TimeField
+        */
+       public static TimeField forTimePattern(String id, String timePattern)
+       {
+               return forTimePattern(id, null, timePattern);
+       }
+
+       /**
+        * Creates a new TimeField using the provided date style.
+        * 
+        * @param id
+        *            The id of the text field
+        * @param model
+        *            The model
+        * @param timeStyle
+        *            Date style to use. The first character is the date style, 
and the second character
+        *            is the time style. Specify a character of 'S' for short 
style, 'M' for medium, 'L'
+        *            for long, and 'F' for full. A date or time may be 
ommitted by specifying a style
+        *            character '-'. See {@link 
org.joda.time.DateTimeFormat#forStyle(String)}.
+        * @return TimeField
+        */
+       public static TimeField forTimeStyle(String id, IModel<LocalTime> 
model, String timeStyle)
+       {
+               return new TimeField(id, model, new 
StyleTimeConverter(timeStyle));
+       }
+
+       /**
+        * Creates a new TimeField using the provided date style.
+        * 
+        * @param id
+        *            The id of the text field
+        * @param timeStyle
+        *            Date style to use. The first character is the date style, 
and the second character
+        *            is the time style. Specify a character of 'S' for short 
style, 'M' for medium, 'L'
+        *            for long, and 'F' for full. A date or time may be 
ommitted by specifying a style
+        *            character '-'. See {@link 
org.joda.time.DateTimeFormat#forStyle(String)}.
+        * @return TimeField
+        */
+       public static TimeField forTimeStyle(String id, String timeStyle)
+       {
+               return forTimeStyle(id, null, timeStyle);
+       }
+
+       /**
+        * Creates a new TimeField defaulting to using a short date pattern
+        * 
+        * @param id
+        *            The id of the text field
+        * @return TimeField
+        */
+       public static TimeField forShortStyle(String id)
+       {
+               return forShortStyle(id, null);
+       }
+
+       /**
+        * Creates a new TimeField defaulting to using a short date pattern
+        * 
+        * @param id
+        *            The id of the text field
+        * @param model
+        *            The model
+        * @return TimeField
+        */
+       public static TimeField forShortStyle(String id, IModel<LocalTime> 
model)
+       {
+               return new TimeField(id, model, new StyleTimeConverter());
+       }
+
+       /**
+        * Creates a new TimeField using the provided converter.
+        * 
+        * @param id
+        *            The id of the text field
+        * @param converter
+        *            the date converter
+        * @return TimeField
+        */
+       public static TimeField withConverter(String id, 
IDateConverter<LocalTime> converter)
+       {
+               return withConverter(id, null, converter);
+       }
+
+       /**
+        * Creates a new TimeField using the provided converter.
+        * 
+        * @param id
+        *            The id of the text field
+        * @param model
+        *            The model
+        * @param converter
+        *            the date converter
+        * @return TimeField
+        */
+       public static TimeField withConverter(String id, IModel<LocalTime> 
model, IDateConverter<LocalTime> converter)
+       {
+               return new TimeField(id, model, converter);
+       }
+
+       /**
+        * The converter for the TextField
+        */
+       private final IDateConverter<LocalTime> converter;
+
+       /**
         * Construct.
         * 
         * @param id
         *      the component id
         */
-       public TimeField(String id)
+       public TimeField(String id, IDateConverter<LocalTime> converter)
        {
-               this(id, null);
+               this(id, null, converter);
        }
 
        /**
@@ -53,19 +245,250 @@ public class TimeField extends DateTimeField
         * @param model
         *      the component's model
         */
-       public TimeField(String id, IModel<ZonedDateTime> model)
+       public TimeField(String id, IModel<LocalTime> model, 
IDateConverter<LocalTime> converter)
        {
                super(id, model);
 
-               getDateTextField().setVisibilityAllowed(false);
+               Args.notNull(converter, "converter");
+               this.converter = converter;
+
+               // Sets the type that will be used when updating the model for 
this component.
+               setType(LocalTime.class);
+
+
+               // Create and add the "hours" TextField
+               add(hoursField = newHoursTextField(HOURS, new HoursModel(), 
Integer.class));
+
+               // Create and add the "minutes" TextField
+               add(minutesField = newMinutesTextField(MINUTES, new 
MinutesModel(), Integer.class));
+
+               // Create and add the "AM/PM" Listbox
+               add(amOrPmChoice = new DropDownChoice<>(AM_OR_PM_CHOICE, new 
AmPmModel(), Arrays.asList(AM_PM.values())));
+
+               add(new WebMarkupContainer("hoursSeparator")
+               {
+                       private static final long serialVersionUID = 1L;
+
+                       @Override
+                       public boolean isVisible()
+                       {
+                               return minutesField.determineVisibility();
+                       }
+               });
+       }
+
+       /**
+        * create a new {@link TextField} instance for hours to be added to 
this panel.
+        * 
+        * @param id
+        *            the component id
+        * @param model
+        *            model that should be used by the {@link TextField}
+        * @param type
+        *            the type of the text field
+        * @return a new text field instance
+        */
+       protected TextField<Integer> newHoursTextField(final String id, 
IModel<Integer> model, Class<Integer> type) {
+               TextField<Integer> hoursTextField = new TextField<>(id, model, 
type);
+               hoursTextField.add(getMaximumHours() == 24 ? 
RangeValidator.range(0, 23) : RangeValidator
+                       .range(1, 12));
+               hoursTextField.setLabel(new Model<>(HOURS));
+               return hoursTextField;
+       }
+
+       /**
+        * create a new {@link TextField} instance for minutes to be added to 
this panel.
+        *
+        * @param id
+        *            the component id
+        * @param model
+        *            model that should be used by the {@link TextField}
+        * @param type
+        *            the type of the text field
+        * @return a new text field instance
+        */
+       protected TextField<Integer> newMinutesTextField(final String id, 
IModel<Integer> model,
+               Class<Integer> type)
+       {
+               TextField<Integer> minutesField = new TextField<Integer>(id, 
model, type)
+               {
+                       private static final long serialVersionUID = 1L;
+
+                       @Override
+                       protected IConverter<?> createConverter(Class<?> type)
+                       {
+                               if (Integer.class.isAssignableFrom(type))
+                               {
+                                       return MINUTES_CONVERTER;
+                               }
+                               return null;
+                       }
+               };
+               minutesField.add(new RangeValidator<>(0, 59));
+               minutesField.setLabel(new Model<>(MINUTES));
+               return minutesField;
+       }
+
+       @Override
+       public String getInput()
+       {
+               // since we override convertInput, we can let this method 
return a value
+               // that is just suitable for error reporting
+               return String.format("%s:%s", hoursField.getInput(), 
minutesField.getInput());
        }
 
        @Override
        public void convertInput()
        {
-               ZonedDateTime modelObject = getModelObject();
-               getDateTextField().setConvertedInput(modelObject != null ? 
modelObject.toLocalDate() : newDateInstance());
+               Integer hoursInput = hoursField.getConvertedInput();
+               Integer minutesInput = minutesField.getConvertedInput();
+               AM_PM amOrPmInput = amOrPmChoice.getConvertedInput();
+
+               // Use the input to create a date object with proper timezone
+               LocalTime localTime = LocalTime.of(hoursInput, minutesInput);
+
+               // Adjust for halfday if needed
+               if (use12HourFormat())
+               {
+                       int halfday = (amOrPmInput == AM_PM.PM ? 1 : 0);
+                       localTime = localTime.with(ChronoField.AMPM_OF_DAY, 
halfday);
+               }
                super.convertInput();
        }
 
+       @Override
+       protected void onBeforeRender() {
+               hoursField.setRequired(isRequired());
+               minutesField.setRequired(isRequired());
+
+               boolean use12HourFormat = use12HourFormat();
+               amOrPmChoice.setVisible(use12HourFormat);
+               super.onBeforeRender();
+       }
+
+       /**
+        * Checks whether the current {@link Locale} uses the 12h or 24h time 
format. This method can be
+        * overridden to e.g. always use 24h format.
+        * 
+        * @return true, if the current {@link Locale} uses the 12h format.<br/>
+        *         false, otherwise
+        */
+       protected boolean use12HourFormat()
+       {
+               String pattern = 
DateTimeFormatterBuilder.getLocalizedDateTimePattern(null, FormatStyle.SHORT, 
IsoChronology.INSTANCE, getLocale());
+               return pattern.indexOf('a') != -1 || pattern.indexOf('h') != -1 
|| pattern.indexOf('K') != -1;
+       }
+
+       /**
+        * @return either 12 or 24, depending on the hour format of the current 
{@link Locale}
+        */
+       private int getMaximumHours()
+       {
+               return getMaximumHours(use12HourFormat());
+       }
+
+       /**
+        * Convenience method (mainly for optimization purposes), in case 
{@link #use12HourFormat()} has
+        * already been stored in a local variable and thus doesn't need to be 
computed again.
+        * 
+        * @param use12HourFormat
+        *            the hour format to use
+        * @return either 12 or 24, depending on the parameter 
<code>use12HourFormat</code>
+        */
+       private int getMaximumHours(boolean use12HourFormat)
+       {
+               return use12HourFormat ? 12 : 24;
+       }
+
+
+       protected class HoursModel implements IModel<Integer>
+       {
+               private static final long serialVersionUID = 1L;
+
+               @Override
+               public Integer getObject()
+               {
+                       return time.getHour();
+               }
+
+               @Override
+               public void setObject(Integer hour)
+               {
+                       time = time.with(ChronoField.HOUR_OF_DAY, hour);
+               }
+
+               @Override
+               public void detach()
+               {
+               }
+       }
+
+       protected class MinutesModel implements IModel<Integer>
+       {
+               private static final long serialVersionUID = 1L;
+
+               @Override
+               public Integer getObject()
+               {
+                       return time.getMinute();
+               }
+
+               @Override
+               public void setObject(Integer minute)
+               {
+                       time = time.with(ChronoField.MINUTE_OF_HOUR, minute);
+               }
+
+               @Override
+               public void detach()
+               {
+               }
+       }
+
+       protected class AmPmModel implements IModel<AM_PM>
+       {
+               private static final long serialVersionUID = 1L;
+
+               @Override
+               public AM_PM getObject()
+               {
+                       int i = time.get(ChronoField.AMPM_OF_DAY);
+                       return i == 0 ? AM_PM.AM : AM_PM.PM;
+               }
+
+               @Override
+               public void setObject(AM_PM amPm)
+               {
+                       int i = AM_PM.AM == amPm ? 0 : 1;
+                       time = time.with(ChronoField.AMPM_OF_DAY, i);
+               }
+
+               @Override
+               public void detach()
+               {
+               }
+       }
+
+       /**
+        * @return The specialized converter.
+        * @see org.apache.wicket.Component#createConverter(java.lang.Class)
+        */
+       @Override
+       protected IConverter<?> createConverter(Class<?> clazz)
+       {
+               if (LocalTime.class.isAssignableFrom(clazz))
+               {
+                       return converter;
+               }
+               return null;
+       }
+
+       /**
+        * @see 
org.apache.wicket.markup.html.form.AbstractTextComponent.ITextFormatProvider#getTextFormat()
+        */
+       @Override
+       public final String getTextFormat()
+       {
+               return converter.getPattern(getLocale());
+       }
 }

http://git-wip-us.apache.org/repos/asf/wicket/blob/2f1b9251/wicket-extensions/src/test/java/org/apache/wicket/extensions/markup/html/form/datetime/DateConverterTest.java
----------------------------------------------------------------------
diff --git 
a/wicket-extensions/src/test/java/org/apache/wicket/extensions/markup/html/form/datetime/DateConverterTest.java
 
b/wicket-extensions/src/test/java/org/apache/wicket/extensions/markup/html/form/datetime/DateConverterTest.java
index 73c5035..d590615 100644
--- 
a/wicket-extensions/src/test/java/org/apache/wicket/extensions/markup/html/form/datetime/DateConverterTest.java
+++ 
b/wicket-extensions/src/test/java/org/apache/wicket/extensions/markup/html/form/datetime/DateConverterTest.java
@@ -23,7 +23,7 @@ import java.util.Calendar;
 import java.util.Date;
 import java.util.Locale;
 
-import 
org.apache.wicket.extensions.markup.html.form.datetime.PatternDateConverter;
+import 
org.apache.wicket.extensions.markup.html.form.datetime.PatternZonedDateTimeConverter;
 import 
org.apache.wicket.extensions.markup.html.form.datetime.StyleZonedDateTimeConverter;
 import org.apache.wicket.util.convert.ConversionException;
 import org.apache.wicket.util.convert.IConverter;
@@ -51,7 +51,7 @@ public class DateConverterTest
 
                Assert.assertEquals(locale, styleFormatter.getLocale());
 
-               PatternDateConverter patternDateConverter = new 
PatternDateConverter(
+               PatternZonedDateTimeConverter patternDateConverter = new 
PatternZonedDateTimeConverter(
                        styleDateConverter.getPattern(locale), false);
                DateTimeFormatter patternFormatter = 
patternDateConverter.getFormat(locale);
 

Reply via email to