Je travaille sur une internationalisation utilisant jQueryUI. J'ai un contrôle DatePicker sur un formulaire qui fonctionne correctement en français.
Lorsque je sélectionne une date, par exemple le 15 août 2012, le DatePicker affichera le 15 août 2012 comme je l’attendais. Mon problème, cependant, est que lorsque le formulaire est posté, la valeur de DatePicker est notée «15 août 2012» et doit maintenant être traduite sur le serveur avant de pouvoir être enregistrée correctement.
Ma question est la suivante: existe-t-il un moyen intégré dans jQueryUI DatePicker afin que je puisse toujours l'envoyer au serveur dans un format cohérent, quelle que soit la langue d'affichage du contrôle? S'il n'y a pas de méthode intégrée, quelles sont les options pour y parvenir?
Je me rends compte que je peux changer le formatde date au 15/08/2012 au lieu d'utiliser la représentation textuelle, mais ce n'est pas ce que je veux faire.
Il y a 2 options de configuration pour cela: altField et altFormat. http://api.jqueryui.com/datepicker/#option-altField Si vous spécifiez un altField, ce champ sera également mis à jour et aura le altFormat . Normalement, vous voudrez faire Si vous utilisez un champ caché, vous pouvez ignorer le champ normal et envoyer à db le champ altField.
Comme vous avez pu le constater, la fourniture d'un dateFormat fonctionne bien pour les nouvelles dates entrées, mais ne modifie pas l'attribut value
qui a déjà été fourni dans le champ d'entrée de date. Cela m'a pris du temps et je ne suis pas sûr que cette solution soit idéale, mais voici ma situation et le code qui la résout. Peut aider les autres avec le même problème dans le futur. Dans mon exemple, j'utilise dd/MM/yyyy
comme format d'affichage.
value
fourni au format yyyy-MM-dd
, comme spécifié par W3C .yyyy-MM-dd
, doit avoir le nom d'origine et un identifiant unique pour que la logique des formulaires continue à fonctionner.yyyy-MM-dd
du champ de saisie à afficher doit être analysée et remplacée par sa contrepartie souhaitée.Donc, voici le code, en utilisant Modernizr pour détecter si le client est capable de restituer en natif les champs de saisie de la date .
if (!Modernizr.inputtypes.date) {
$('input[type=date]').each(function (index, element) {
/* Create a hidden clone, which will contain the actual value */
var clone = $(this).clone();
clone.insertAfter(this);
clone.hide();
/* Rename the original field, used to contain the display value */
$(this).attr('id', $(this).attr('id') + '-display');
$(this).attr('name', $(this).attr('name') + '-display');
/* Create the datepicker with the desired display format and alt field */
$(this).datepicker({ dateFormat: "dd/mm/yy", altField: "#" + clone.attr("id"), altFormat: "yy-mm-dd" });
/* Finally, parse the value and change it to the display format */
if ($(this).attr('value')) {
var date = $.datepicker.parseDate("yy-mm-dd", $(this).attr('value'));
$(this).attr('value', $.datepicker.formatDate("dd/mm/yy", date));
}
});
}
Comme @ Pawel-Dyda l’a mentionné,
getDate () méthode
var currentDate = $( ".selector" ).datepicker( "getDate" );
Voici un exemple de ce qu'il retourne: Wed Jan 20 2016 00:00:00 GMT+0300.
Vous pouvez l'analyser en Javascript, PHP, SQL ou autre.
select str_to_date('Wed Jan 20 2016 00:00:00 GMT+0300','%a %b %d %Y %H:%i:%s');
Résultats:
2016-01-20 00:00:00
Solution fonctionnant pour ASP.NET
@using (Html.BeginForm("ActionName", "ControllerName"))
{
@Html.HiddenFor(m => m.DateFrom)
@Html.HiddenFor(m => m.DateTo)
<div class="form-group">
@Html.LabelFor(m => m.DateFrom)
<input id="datepicker-date-from" type="text" class="form-control datepicker" value="@Model.DateFrom.Date.ToString("dd.MM.yyyy")"/>
</div>
<div class="form-group">
@Html.LabelFor(m => m.DateTo)
<input id="datepicker-date-to" type="text" class="form-control datepicker" value="@Model.DateTo.Date.ToString("dd.MM.yyyy")" />
</div>
<input type="submit" class="btn btn-sn btn-primary" value="Download" />
}
@section scripts {
<script type="text/javascript">
$(function () {
$("#datepicker-date-from").datepicker(
{
dateFormat: "dd.mm.yy",
altField: @Html.IdFor(m => m.DateFrom),
altFormat: "yy-mm-dd"
});
$("#datepicker-date-to").datepicker(
{
dateFormat: "dd.mm.yy",
altField: @Html.IdFor(m => m.DateTo),
altFormat: "yy-mm-dd"
});
});
</script>
}
En principe, vous devriez not reformater la date. Au lieu de cela, vous devez lire l’objet Date de JavaScript à partir de Datepicker, via getDate () method. Ensuite, vous devez le transmettre au serveur.
La question est de savoir comment. Fondamentalement, ce que vous voulez, c'est un format commun. Si vous utilisez JSON, la réponse est très simple, il suffit de mettre un objet date et la fonction stringify () de JSON le formatera automatiquement en ISO8601 .
Comme vous pouvez le constater sur Wikipedia, ISO8601 a été conçu pour permettre un échange fiable de la date et de l'heure. C'est donc ce que vous devez utiliser.
Il peut être utile de savoir que les navigateurs Web modernes prennent en charge la méthode toISOString()
de l'objet Date.
Il semble que quelqu'un d'autre ait eu cette question ou une question similaire avant la vôtre.
Si vous lisez ce stackoverflow answer , l'auteur essayait d'afficher la date dans un format et de transmettre les données à MySQL dans un autre format.
La réponse précédente dans ce lien vous permet d’être configuré pour accéder à la valeur sélectionnée en tant que variable. Maintenant, tout ce dont vous avez besoin est de câbler une analyse parDate à la variable de date sélectionnée.
<script type="text/javascript">
$('#cal').datepicker({
dateFormat: 'dd M yy',
onSelect: function(dateText, inst) {
var dateAsString = dateText; //the first parameter of this function
var newDateFormat = $.datepicker.parseDate('dd-mm-yyyy', dateAsString);
}
});
</script>
Vérifiez le lien parseDate pour connaître les paramètres et le formatage.
J'espère que cela t'aides!