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!
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
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.
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)
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?
- Java SE 8 et SE 9 et plus
- Built-in.
- fait partie de L'API Java standard avec une implémentation groupée.
- Java 9 ajoute des fonctionnalités mineures et des corrections.
- Java SE 6 et SE 7
- une grande partie de la java.la fonctionnalité time est rétroportée à Java 6 & 7 dans ThreeTen-Backport .
- Android
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 .
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");
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.
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;
}
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
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