2017-08-23 7 views
0

J'ai un texte d'entrée où je reçois la date:ColdFusion dateformat format incorrect

<input type="text" name="myDate" /> 

Après avoir soumis le formulaire, j'enregistrer cette date dans la base de données faisant une dateformat:

#DateFormat(myDate, "yyyy-mm-dd")# 

Si la l'utilisateur entre: 19/02/1948, il enregistre correctement: 1948-02-19. Mais si l'utilisateur entre: 02191948, il enregistre: 7901-05-07. Pourquoi? Est-ce que quelqu'un sait comment je peux le réparer?

Merci

+0

Habituellement entrées de date sont plus strictes que d'une seule zone de texte. Les listes déroulantes pour le mois, le jour et l'année sont assez standard et vous n'auriez pas à faire face à des problèmes comme celui-ci. –

+0

Je vois ... J'ai un plugin calendrier tcal javascript, mais il me permet d'entrer la date comme 02191948 – user6824563

+0

Savez-vous si je peux faire une validation JS avant de soumettre le formulaire? – user6824563

Répondre

0

DateFormat() de ColdFusion attend une représentation de date valide. ColdFusion est très bâclée quand il s'agit de savoir quel type d'entrée est considéré comme valide. Les entrées de date sécurisées sont ODBC literals et most of ISO 8601. Méfiez-vous des pièges de format comme mm/dd et dd.mm et évitez-les tout à fait, si possible.

Ce que vous voulez utiliser est LSParseDateTime(). Il vous permet de spécifier les paramètres régionaux et le format que vous attendez et de faire en sorte que ColdFusion analyse un objet date basé sur l'entrée. Ce n'est pas infaillible cependant, ce qui signifie que vous devez le faire au cas où l'entrée ne correspond pas du tout. Il existe un LSIsDate() à sécurité intégrée, qui vous indique si l'entrée est considérée comme valide dans les paramètres régionaux spécifiés. Mais de toute façon, c'est un jeu de détection de format. Avoir fixé <select> étiquettes pour le mois, le jour et l'année est le moyen le plus simple d'éviter les problèmes.

démo en vrac pour l'entrée de date localisée:

<cfset myLocale = "en_US"> 
<cfset myDateFormat = "yyyy-mm-dd"> 

<cfset dateByInput = ""> 
<cfset errorReason = ""> 

<cfif structKeyExists(FORM, "myDate")> 
    <cfif lsIsDate(FORM["myDate"], myLocale)> 
     <cftry> 
      <cfset dateByInput = lsParseDateTime(FORM["myDate"], myLocale, myDateFormat)> 
      <cfcatch> 
       <cfset errorReason = ("Your input is invalid. Please enter in the following format: " & myDateFormat)> 
      </cfcatch> 
     </cftry> 
    <cfelse> 
     <cfset errorReason = ("Your input is invalid. Please enter in the following format: " & myDateFormat)> 
    </cfif> 
</cfif> 

<cfset dateByInputIsValid = isDate(dateByInput)> <!--- note: it's sufficient to use the unlocalized date check here, since dateByInput is either not valid at all or a (universal) date object ---> 

<cfif dateByInputIsValid> 

    <!--- store date input in database ---> 
    <cftry> 
     <cfset myDatasource = "exampleDS"> 
     <cfquery datasource="#myDatasource#"> 
      INSERT INTO `myDatabase`.`myTable` (`myDateColumn`) VALUES (
       <cfqueryparam value="#dateByInput#" cfSqlType="CF_SQL_TIMESTAMP"> 
      ) 
     </cfquery> 
     <cfcatch> 
      <cfset errorReason = "Oh noes, something went wrong attempting to save your input."> 
     </cfcatch> 
    </cftry> 

</cfif> 

<cfoutput> 
    <cfif dateByInputIsValid> 
     <p>Date input valid: #lsDateFormat(dateByInput, myDateFormat, myLocale)#</p> 
     <cfif len(errorReason)> 
      <p>#errorReason#</p> 
     <cfelse> 
      <p>Input successfully stored in database.</p> 
     </cfif> 
    <cfelse> 
     <cfif len(errorReason)> 
      <p>#errorReason#</p> 
     </cfif> 
     <form method="post"> 
      <input type="text" name="myDate" /> 
      <button type="submit">send</button> 
     </form> 
    </cfif> 
</cfoutput>