Convertir une chaîne de caractères en objet calendrier en Java

Je suis nouveau en Java, je travaille habituellement avec PHP.

j'essaie de convertir cette chaîne:

lun Mar 14 16: 02: 37 GMT 2011

dans un objet de calendrier pour que je puisse facilement tirer L'année et le mois comme ceci:

String yearAndMonth = cal.get(Calendar.YEAR)+cal.get(Calendar.MONTH);

serait-ce une mauvaise idée de l'analyser manuellement? En utilisant une méthode de sous-traitance?

N'importe quel conseil aiderait merci!

135
demandé sur Azhar Bandri 2011-03-14 19:08:06

8 réponses

Calendar cal = Calendar.getInstance();
SimpleDateFormat sdf = new SimpleDateFormat("EEE MMM dd HH:mm:ss z yyyy", Locale.ENGLISH);
cal.setTime(sdf.parse("Mon Mar 14 16:02:37 GMT 2011"));// all done

note: définir Locale en fonction de votre environnement/exigence


Voir Aussi

333
répondu Jigar Joshi 2016-11-09 10:53:11

Eh bien, je pense que ce serait une mauvaise idée de répliquer le code qui est déjà présent dans les classes comme SimpleDateFormat .

d'autre part, personnellement, je suggérerais d'éviter Calendar et Date entièrement si vous le pouvez, et en utilisant Joda Time à la place, comme une date et heure API beaucoup mieux conçu. Par exemple, vous devez être conscient que SimpleDateFormat est pas thread-safe, donc vous besoin de thread habitants, la synchronisation, ou une nouvelle instance à chaque fois que vous l'utilisez. Joda des analyseurs et des formateurs sont thread-safe.

11
répondu Jon Skeet 2011-03-14 16:19:25

aucun nouveau calendrier n'a besoin d'être créé, SimpleDateFormat utilise déjà un calendrier ci-dessous.

SimpleDateFormat sdf = new SimpleDateFormat("EEE MMM dd HH:mm:ss z yyyy", Locale.EN_US);
Date date = sdf.parse("Mon Mar 14 16:02:37 GMT 2011"));// all done
Calendar cal = sdf.getCalendar();

(Je ne peux pas encore commenter, c'est pourquoi j'ai créé une nouvelle réponse)

9
répondu GoGoris 2016-08-11 09:01:51

tl; dr

l'approche moderne utilise le java.temps classes.

YearMonth.from(
    ZonedDateTime.parse( 
        "Mon Mar 14 16:02:37 GMT 2011" , 
        DateTimeFormatter.ofPattern( "E MMM d HH:mm:ss z uuuu" )
     )
).toString()

2011-03

éviter les classes date-heure héritées

La façon moderne est en java.les classes de temps. Les anciennes classes de datation comme Calendar se sont avérées mal conçues, déroutantes et ennuyeuses.

définir une coutume formatteur pour correspondre à votre entrée de chaîne.

String input = "Mon Mar 14 16:02:37 GMT 2011";
DateTimeFormatter f = DateTimeFormatter.ofPattern( "E MMM d HH:mm:ss z uuuu" );

Analyser comme un ZonedDateTime .

ZonedDateTime zdt = ZonedDateTime.parse( input , f );

vous êtes intéressé par l'année et le mois. Java.les classes de temps comprennent la classe YearMonth à cette fin.

YearMonth ym = YearMonth.from( zdt );

vous pouvez interroger pour les nombres d'année et de mois si nécessaire.

int year = ym.getYear();
int month = ym.getMonthValue();

mais la méthode toString génère une chaîne dans la norme ISO 8601 format.

String output = ym.toString();

mettez tout ça ensemble.

String input = "Mon Mar 14 16:02:37 GMT 2011";
DateTimeFormatter f = DateTimeFormatter.ofPattern( "E MMM d HH:mm:ss z uuuu" );
ZonedDateTime zdt = ZonedDateTime.parse( input , f );
YearMonth ym = YearMonth.from( zdt );
int year = ym.getYear();
int month = ym.getMonthValue();

Dump à console.

System.out.println( "input: " + input );
System.out.println( "zdt: " + zdt );
System.out.println( "ym: " + ym );

input: Mon Mar 14 16: 02 :37 GMT 2011

zdt: 2011-03-14T16:02: 37Z[GMT]

ym: 2011-03

Live code

Voir le présent code s'exécutant dans IdeOne.com .

Conversion

si vous devez avoir un objet Calendar , vous pouvez convertir en GregorianCalendar en utilisant de nouvelles méthodes ajoutées aux anciennes classes.

GregorianCalendar gc = GregorianCalendar.from( zdt );

à Propos de java.time

Le de java.time framework est construit dans Java 8 et plus tard. Ces classes supplantent les troublant Vieux legacy date-heure classes telles que java.util.Date , Calendar , & SimpleDateFormat .

le projet Joda-Time , maintenant en mode maintenance , conseille la migration vers java.temps.

pour en savoir plus, voir le Oracle Tutorial . Et le débordement de la pile de recherche pour de nombreux exemples et des explications. La spécification est JSR 310 .

où obtenir le java.les classes de temps?

le projet ThreeTen-Extra étend java.temps avec des cours supplémentaires. Ce projet est un terrain d'expérimentation pour d'éventuelles futures additions à java.temps. Vous pouvez trouver ici quelques cours utiles tels que: Interval , YearWeek , YearQuarter , et plus .

9
répondu Basil Bourque 2018-10-02 00:26:42

SimpleDateFormat est grande, il suffit de noter que HH est différent de hh lorsque l'on travaille avec des heures. HH retournera les heures de base de 24 heures et hh retournera les heures de base de 12 heures.

par exemple, le suivant retournera 12 heures de temps:

SimpleDateFormat sdf = new SimpleDateFormat("hh:mm aa");

Alors que ce sera le retour de 24 heures:

SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");
5
répondu Philip 2015-09-23 12:24:57

Oui ce serait une mauvaise pratique de l'analyser vous-même. Jetez un oeil à SimpleDateFormat , il va transformer la chaîne de caractères en une Date et vous pouvez définir la Date dans une instance de calendrier.

3
répondu John Vint 2015-03-06 00:02:05

méthode Simple:

public Calendar stringToCalendar(String date, String pattern) throws ParseException {
    String DEFAULT_LOCALE_NAME = "pt";
    String DEFAULT_COUNTRY = "BR";
    Locale DEFAULT_LOCALE = new Locale(DEFAULT_LOCALE_NAME, DEFAULT_COUNTRY);
    SimpleDateFormat format = new SimpleDateFormat(pattern, LocaleUtils.DEFAULT_LOCALE);
    Date d = format.parse(date);
    Calendar c = getCalendar();
    c.setTime(d);
    return c;
}
0
répondu Alberto Cerqueira 2016-11-01 19:53:45

parle un temps avec le fuseau horaire, Z dans le motif est pour le fuseau horaire

String aTime = "2017-10-25T11:39:00+09:00";
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ", Locale.getDefault());
try {
    Calendar cal = Calendar.getInstance();
    cal.setTime(sdf.parse(aTime));
    Log.i(TAG, "time = " + cal.getTimeInMillis()); 
} catch (ParseException e) {
    e.printStackTrace();
}

sortie: il retournera L'heure UTC

1508899140000

enter image description here

si nous ne définissons pas le fuseau horaire comme yyyy-MM-dd'T'HH:mm:ss . SimpleDateFormat utilisera le fuseau horaire défini dans Setting

0
répondu Phan Van Linh 2017-10-25 04:18:47