Format dates pour import

Bonjour, je suis entrain d’importer des évènements (Appels, RDV, tâches) et j’aimerai simplier la mise en forme des dates. Dans le fichier de démo, elles sont renseignées avec cette forme: NOW[-5M09H30m]
J’aimerai simplement importer des dates au forme jj/mm/aaaa HH:mm et pas des dates en fonction du temps système au moment de l’import.
Quand j’exporte depuis axelor, le format obtenu est aaa-mm-jjTHH:mm

Je ne comprend pas pourquoi ce format n’est pas utilisé pour l’import alors qu’il l’est pour l’export.

J’ai trouvé la méthode qui gère le format d’import : ImportDateTime et importDate
Cependant je ne comprend pas tout. Avez vous trouvé un moyen d’importer facilement les dates?

voici le script d’import ImportDateTime.java (axelor-erp/modules/abs/axelor-base/src/main/java/com/axelor/csv/script)

/*
 * Axelor Business Solutions
 *
 * Copyright (C) 2018 Axelor (<http://axelor.com>).
 *
 * This program is free software: you can redistribute it and/or  modify
 * it under the terms of the GNU Affero General Public License, version 3,
 * as published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
package com.axelor.csv.script;

import com.google.common.base.Strings;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Arrays;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class ImportDateTime {
  String pat = "((\\+|\\-)?[0-9]{1,%s}%s)";
  String dt = "[0-9]{4}-[0-9]{2}-[0-9]{2}";
  Pattern patternYear = Pattern.compile("[0-9]{1,4}");
  Pattern patternMonth = Pattern.compile("[0-9]{1,2}");

  public LocalDateTime updateYear(LocalDateTime datetime, String year) {
    if (!Strings.isNullOrEmpty(year)) {
      Matcher matcher = patternYear.matcher(year);
      if (matcher.find()) {
        Long years = Long.parseLong(matcher.group());
        if (year.startsWith("+")) datetime = datetime.plusYears(years);
        else if (year.startsWith("-")) datetime = datetime.minusYears(years);
        else datetime = datetime.withYear(years.intValue());
      }
    }
    return datetime;
  }

  public LocalDateTime updateMonth(LocalDateTime datetime, String month) {
    if (!Strings.isNullOrEmpty(month)) {
      Matcher matcher = patternMonth.matcher(month);
      if (matcher.find()) {
        Long months = Long.parseLong(matcher.group());
        if (month.startsWith("+")) datetime = datetime.plusMonths(months);
        else if (month.startsWith("-")) datetime = datetime.minusMonths(months);
        else datetime = datetime.withMonth(months.intValue());
      }
    }
    return datetime;
  }

  public LocalDateTime updateDay(LocalDateTime datetime, String day) {
    if (!Strings.isNullOrEmpty(day)) {
      Matcher matcher = patternMonth.matcher(day);
      if (matcher.find()) {
        Long days = Long.parseLong(matcher.group());
        if (day.startsWith("+")) datetime = datetime.plusDays(days);
        else if (day.startsWith("-")) datetime = datetime.minusDays(days);
        else {
          if (days > datetime.toLocalDate().lengthOfMonth()) {
            days = Long.valueOf(datetime.toLocalDate().lengthOfMonth());
          }
          datetime = datetime.withDayOfMonth(days.intValue());
        }
      }
    }
    return datetime;
  }

  public LocalDateTime updateHour(LocalDateTime datetime, String hour) {
    if (!Strings.isNullOrEmpty(hour)) {
      Matcher matcher = patternMonth.matcher(hour);
      if (matcher.find()) {
        Long hours = Long.parseLong(matcher.group());
        if (hour.startsWith("+")) datetime = datetime.plusHours(hours);
        else if (hour.startsWith("-")) datetime = datetime.minusHours(hours);
        else datetime = datetime.withHour(hours.intValue());
      }
    }
    return datetime;
  }

  public LocalDateTime updateMinute(LocalDateTime datetime, String minute) {
    if (!Strings.isNullOrEmpty(minute)) {
      Matcher matcher = patternMonth.matcher(minute);
      if (matcher.find()) {
        Long minutes = Long.parseLong(matcher.group());
        if (minute.startsWith("+")) datetime = datetime.plusMinutes(minutes);
        else if (minute.startsWith("-")) datetime = datetime.minusMinutes(minutes);
        else datetime = datetime.withMinute(minutes.intValue());
      }
    }
    return datetime;
  }

  public LocalDateTime updateSecond(LocalDateTime datetime, String second) {
    if (!Strings.isNullOrEmpty(second)) {
      Matcher matcher = patternMonth.matcher(second);
      if (matcher.find()) {
        Long seconds = Long.parseLong(matcher.group());
        if (second.startsWith("+")) datetime = datetime.plusSeconds(seconds);
        else if (second.startsWith("-")) datetime = datetime.minusSeconds(seconds);
        else datetime = datetime.withSecond(seconds.intValue());
      }
    }
    return datetime;
  }

  public String importDate(String inputDate) {

  String patDate =
        "("
            + dt
            + "|TODAY)(\\[("
            + String.format(pat, 4, "y")
            + "?"
            + String.format(pat, 2, "M")
            + "?"
            + String.format(pat, 2, "d")
            + "?"
            + ")\\])?";
	  
    try {
      if (!Strings.isNullOrEmpty(inputDate) && inputDate.matches(patDate)) {
        List<String> dates = Arrays.asList(inputDate.split("\\["));
        inputDate = dates.get(0).equals("TODAY") ? LocalDate.now().toString() : dates.get(0);
        if (dates.size() > 1) {
          LocalDateTime localDate =
              LocalDate.parse(inputDate, DateTimeFormatter.ISO_DATE).atStartOfDay();
          Matcher matcher = Pattern.compile(String.format(pat, 4, "y")).matcher(dates.get(1));
          if (matcher.find()) localDate = updateYear(localDate, matcher.group());
          matcher = Pattern.compile(String.format(pat, 2, "M")).matcher(dates.get(1));
          if (matcher.find()) localDate = updateMonth(localDate, matcher.group());
          matcher = Pattern.compile(String.format(pat, 2, "d")).matcher(dates.get(1));
          if (matcher.find()) localDate = updateDay(localDate, matcher.group());
          return localDate.toString();
        } else return inputDate;
      } else return null;
    } catch (Exception e) {
      e.printStackTrace();
      return null;
    }
  }

  public String importDateTime(String inputDateTime) {
    String tm = "[0-9]{2}:[0-9]{2}:[0-9]{2}";
    String patTime =
        "("
            + dt
            + " "
            + tm
            + "|NOW)(\\[("
            + String.format(pat, 4, "y")
            + "?"
            + String.format(pat, 2, "M")
            + "?"
            + String.format(pat, 2, "d")
            + "?"
            + String.format(pat, 2, "H")
            + "?"
            + String.format(pat, 2, "m")
            + "?"
            + String.format(pat, 2, "s")
            + "?"
            + ")\\])?";
    try {
      if (!Strings.isNullOrEmpty(inputDateTime) && inputDateTime.matches(patTime)) {
        List<String> timeList = Arrays.asList(inputDateTime.split("\\["));
        inputDateTime =
            timeList.get(0).equals("NOW") ? LocalDateTime.now().toString() : timeList.get(0);
        if (timeList.size() > 1) {
          LocalDateTime datetime =
              LocalDateTime.parse(inputDateTime, DateTimeFormatter.ISO_DATE_TIME);
          Matcher matcher = Pattern.compile(String.format(pat, 4, "y")).matcher(timeList.get(1));
          if (matcher.find()) datetime = updateYear(datetime, matcher.group());
          matcher = Pattern.compile(String.format(pat, 2, "M")).matcher(timeList.get(1));
          if (matcher.find()) datetime = updateMonth(datetime, matcher.group());
          matcher = Pattern.compile(String.format(pat, 2, "d")).matcher(timeList.get(1));
          if (matcher.find()) datetime = updateDay(datetime, matcher.group());
          matcher = Pattern.compile(String.format(pat, 2, "H")).matcher(timeList.get(1));
          if (matcher.find()) datetime = updateHour(datetime, matcher.group());
          matcher = Pattern.compile(String.format(pat, 2, "m")).matcher(timeList.get(1));
          if (matcher.find()) datetime = updateMinute(datetime, matcher.group());
          matcher = Pattern.compile(String.format(pat, 2, "s")).matcher(timeList.get(1));
          if (matcher.find()) datetime = updateSecond(datetime, matcher.group());
          return datetime.toString();
        }
        return inputDateTime.replace(" ", "T");
      }
      return null;
    } catch (Exception e) {
      e.printStackTrace();
      return null;
    }
  }
}

Bonjour,

L’intérêt est de pouvoir avoir des données de démo « contemporaines » quel que soit le moment de l’import. Cela n’a aucun intérêt en dehors d’un contexte de démo.

Toutefois une lecture rapide semble montrer que importdate est tout à fait à l’aise avec une date au format yyyy-MM-dd et importDateTime avec une date yyyy-MM-dd HH:mm:ss

Cordialement,

Bonjour, c’est ce que je pensais aussi mais ces deux formats entrainent une erreur à l’import:

ConstraintViolationImpl{interpolatedMessage=‹ ne peut pas être nul ›, propertyPath=startDateTime

Il dit que les champs sont vides car il ne reconnait ni ce pattern: image

ni celui ci image

Je ne comprend pas la différence entre « NOW » et « TODAY ».

Je ne suis absolument pas programmeur en java et j’ai des grosses lacunes sur la signification de certains signes donc je n’arrive pas à comprendre ce code…

Merci quand même de m’avoir répondu!

Bonjour,

En fait dans le code que tu as posté tu as patTime qui est une variable.
En gros “patTime” prend une valeur en fonction du contexte. Et le String avant signifie que patTime est une suite de caractère qui forment un texte, tout ce qui est écrit entre les doublequote (le symbole " ), sera affiché tel quel par patTime et les + signifie que nous concatenons chaques éléments. Donc concrètement que nous les mettons bout à bout pour avoir une chaine de caractère.
la valeur dt est présenté sous cette forme :
String dt = “[0-9]{4}-[0-9]{2}-[0-9]{2}”;
Ce qui veut dire que c’est un tableau de 3 cellules qui ne peut contenir que des chiffres de 0 à 9 et dont la première case peut contenir 4 chiffres (pour l’année ) puis la suivante 2 chiffre et encore la suivante 2 aussi

et pareil pour tm mais cette fois c’est l’heure.

Je pense que patTime doit être une variable qui une fois appelée peur servir dans une fonction pour générer la date et l’heure.

ahhhhh c’est donc comme ça qu’on déclare un tableau de String en java. Merci beaucoup pour ton explication! Je vais essayer de décortiquer tout ça pour comprendre ce que je peux mettre en entrée pour que ça marche

Attention c’est pas comme ça qu’on fait pour déclarer un tableau dt en lui même n’est pas un tableau réellement mais je pense que son usage est destiné à cela.

Tiens j’ai chopper ça sur Open Classroom :slight_smile:

int tableauEntier[] = {0,1,2,3,4,5,6,7,8,9};
double tableauDouble[] = {0.0,1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0};
char tableauCaractere[] = {‘a’,‘b’,‘c’,‘d’,‘e’,‘f’,‘g’};
String tableauChaine[] = {“chaine1”, “chaine2”, “chaine3” , “chaine4”};

Voilà comment on fait un atbleau pour chaque type de données
int représente les entiers, double représente les nombres decimaux, char represente un caractère unique et String comme tu le sais est destiné aux chaine de caractère, tu retrouveras ce type de classification partout en développement.

Bonjour, c’est ce que je pensais aussi mais ces deux formats entrainent une erreur à l’import:
ConstraintViolationImpl{interpolatedMessage=‘ne peut pas être nul’, propertyPath=startDateTime

Quelle est la valeur qui pose problème ?

Je rentre ça pour mes dates de début et de fin:
image

et il me dit qu’il ne peut pas réaliser l’import car ces deux champs sont vides.

Quand je fais le meme import avec les dates de cette forme: image

ça fonctionne très bien

Il faudrait la source du fichier CSV, pas ce qu’affiche Excel, on sait jamais

importId;user.code;partner.importId;typeSelect;subject;description;callTypeSelect;eventCategory.code;statusSelect;prioritySelect;startDateTimeNow;endDateTimeNow;limitDateTNow;createdOnNow
1;nom1;10;2;Brochure + Carte de visite déposés + Ref Salon ;Rencontre du PDG;;RDVP;;;2018-02-19;2018-02-20;;
2;nom1;20;1;Prise de rdv;;;;;;2018-02-19;2018-02-20;;
3;nom2;30;2;Pas de projet mais connais la société;;;;;;2018-02-19;2018-02-20;;
4;nom1;40;3;Faire prévision commerciale mois;Inclure projet pour client;;;12;4;2018-02-19;2018-02-20;;

Les dates apparaissent correctement sur notepad++ et l’encodage est correct (utf8)

et le contenu du XML qui décrit le format d’import ?

Oui donc c’est normal, comme indiqué plus haut importDateTime attend yyyy-MM-dd HH:mm:ss donc soit vous utilisez importDate soit vous modifiez le format d’entrée et ça doit passer

1 « J'aime »

Han la boulette… J’avais essayé avec ce format quand vous me l’avez indiqué mais j’avais encore l’erreur. Le problème je pense c’est que Excel avait passé la cellule de format texte à format date et mis des “/” à la place des “-”. Ça m’apprendra à oublier de vérifier avec Notepad. Merci beaucoup!!! Ça va m’épargner pas mal de traitement de données…

Bon courage :slight_smile:

1 « J'aime »

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.