bugfix> java > 投稿

日付と時刻を編集しようとすると、できません。エラーが表示されます:

Cannot format given Object as a Date.

これはRegistroBeanです

public String Editar(Integer id){
    Registros r=this.registrosFacade.find(id);
    DateFormat dateFormatter = new SimpleDateFormat("MM/dd/yyyy");  
    String strDate = dateFormatter.format(fecha);
    fecha = strDate;
    this.fecha=r.getFecha().toString();
    DateFormat dateFormat = new SimpleDateFormat("HH:mm:ss 'Z'");  
    dateFormat.setTimeZone(TimeZone.getTimeZone("GMT"));
    String strHour = dateFormat.format(hora_in);
    hora_in = strHour;
    this.hora_in=r.getHoraIn().toString();
    String strHour2 = dateFormat.format(hora_out);
    hora_out = strHour2;
    this.hora_out=r.getHoraOut().toString();
    this.vehiculo=r.getIdVehiculo();
    return "RegistroEdit";
}
public String GuardarEdicion(RegistroController rc, int id) throws ParseException{
    Registros r = new Registros();
    Locale locale = new Locale("es","CO");
    String datef = "MM/dd/yyyy";
    SimpleDateFormat formatter = new SimpleDateFormat(datef, locale);
    Date parsedDate = formatter.parse(fecha);
    r.setFecha(parsedDate);
    String hourf = "HH:mm:ss 'Z'";
    SimpleDateFormat format = new SimpleDateFormat(hourf, locale);
    format.setTimeZone(TimeZone.getTimeZone("GMT"));
    Date Hin = format.parse(hora_in);
    r.setHoraIn(Hin);
    Date Hout = format.parse(hora_out);
    r.setHoraOut(Hout);
    r.setIdVehiculo(vehiculosFacade.find(vehiculo.getId()));
    this.registrosFacade.edit(r);
    return "RegistroList";
}

編集するときのリストビューで、このボタンをクリックします。

<h:commandButton value="Editar" action="#{registroController.Editar(item.id)}"/>

これはRegistroEdit.xhtmlです

<?xml version='1.0' encoding='UTF-8' ?>
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 <html xmlns="http://www.w3.org/1999/xhtml"
         xmlns:h="http://xmlns.jcp.org/jsf/html"
         xmlns:f="http://xmlns.jcp.org/jsf/core"
         xmlns:p="http://primefaces.org/ui"
         xmlns:ui="http://java.sun.com/jsf/facelets">
     <h:head>
        <title>Facelet Title</title>
     </h:head>
     <h:body>
        <f:view>
            <h:form>
                <h1><h:outputText value="Editar Registro"/></h1>
                <p:panelGrid columns="2">
                    <p:outputLabel value="Fecha:" for="fecha" />
                    <p:inputText id="fecha" value="#{registroController.fecha}" title="Fecha" >
                    </p:inputText>
                    <p:outputLabel value="HoraIn:" for="horaIn" />
                    <p:inputText id="horaIn" value="#{registroController.hora_in}" title="HoraIn" required="true" requiredMessage="The HoraIn field is required.">
                    </p:inputText>
                    <p:outputLabel value="HoraOut:" for="horaOut" />
                    <p:inputText id="horaOut" value="#{registroController.hora_out}" title="HoraOut" required="true" requiredMessage="The HoraOut field is required.">
                    </p:inputText>
                    <p:outputLabel value="IdVehiculo:" for="idVehiculo" />
                    <p:selectOneMenu id="idVehiculo" value="#{registroController.vehiculo.id}" required="true" requiredMessage="The IdVehiculo field is required.">
                        <!-- TODO: update below reference to list of available items-->
                        <f:selectItems value="#{vehiculoController.findAll()}" var="v" itemLabel="#{v.placa}" itemValue="#{v.id}"/>
                    </p:selectOneMenu>
                </p:panelGrid>
                <h:panelGrid columns="2">
                    <h:commandButton id="registroCommand" value="Guardar"
                                  action="#{registroController.GuardarEdicion(registroController, registroController.id)}"/>          
                    <h:commandButton id="registroCommand1" value="Ir a Lista"
                                 action="#{registro.prepareList()}"/> 
                </h:panelGrid>
            </h:form>
        </f:view>
    </h:body>
</html>

リストビューに表示される日付と時刻を次の形式で編集しようとしています。

fecha:日5月27日00:00:00 COT 2018

hora_in:木1月1日06:15:30 COT 1970

hora_out:木1月01 14:30:00 COT 1970

この形式で日付と時刻を表示する必要があります

fecha:2018年5月27日

hora_in:06:15:30

hora_out:14:30:00

エラーなしで日付を文字列に変換するにはどうすればよいですか?

回答 1 件
  • コンテキスト外でのメソッドの理解をあきらめました。次のようなことをしていると思います。

       DateTimeFormatter dateFormatter = DateTimeFormatter. ofPattern("MM/dd/yyyy");
        DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("HH:mm:ss X");
        ZoneOffset offset = ZoneOffset.UTC;
        LocalDate fecha = LocalDate.now(offset);
        OffsetTime horaIn = OffsetTime.of(15, 0, 0, 0, offset);
        OffsetTime horaOut = OffsetTime.of(17, 37, 15, 0, offset);
        String strDate = fecha.format(dateFormatter);
        System.out.println(strDate);
        String strHourIn = horaIn.format(timeFormatter);
        System.out.println(strHourIn);
        String strHourOut = horaOut.format(timeFormatter);
        System.out.println(strHourOut);
    
    

    このコードは次を印刷します:

    05/25/2018
    15:00:00 Z
    17:37:15 Z
    
    

    私は java.time を使用しています 、最新のJava日時API。 SimpleDateFormat  厄介なことで有名で、 Date と一緒に  および DateFormat  古くなった。文字 Z をハードコーディングするのではなく  時間形式では、オフセットをデータにフォーマットすることを好み、ある日別のオフセットを使用することにした場合に正しい出力が得られるようにフォーマットします( OffsetTime  クラスはほとんど使用されませんが、ここでは正しいようです)。

    時間を LocalTime として取得する場合 、つまり、データベースからのオフセットなしで、次のように変換します。

       OffsetTime hora = localTimeFromDatabase.atOffset(offset);
    
    

    リンク: Oracleチュートリアル: java.time の使用方法を説明するDate Time 。

あなたの答え