我对Java不熟悉,通常使用PHP。
我正在尝试转换这个字符串:
格林威治标准时间2011年3月14日星期三16:02:37
放入一个日历对象,这样我就可以像这样轻松地拖动年和月:
String yearAndMonth = cal.get(Calendar.YEAR)+cal.get(Calendar.MONTH);
手动解析它是不是一个坏主意?使用子字符串方法?
任何建议都会有帮助,谢谢!
我对Java不熟悉,通常使用PHP。
我正在尝试转换这个字符串:
格林威治标准时间2011年3月14日星期三16:02:37
放入一个日历对象,这样我就可以像这样轻松地拖动年和月:
String yearAndMonth = cal.get(Calendar.YEAR)+cal.get(Calendar.MONTH);
手动解析它是不是一个坏主意?使用子字符串方法?
任何建议都会有帮助,谢谢!
当前回答
博士tl;
现代的方法使用java。时间类。
YearMonth.from(
ZonedDateTime.parse(
"Mon Mar 14 16:02:37 GMT 2011" ,
DateTimeFormatter.ofPattern( "E MMM d HH:mm:ss z uuuu" )
)
).toString()
The 2011-03
避免遗留的日期-时间类
现代的方法是用java。时间类。旧的日期-时间类(如Calendar)已被证明设计糟糕、令人困惑且麻烦。
定义一个自定义格式化程序来匹配字符串输入。
String input = "Mon Mar 14 16:02:37 GMT 2011";
DateTimeFormatter f = DateTimeFormatter.ofPattern( "E MMM d HH:mm:ss z uuuu" );
解析为zone datetime。
ZonedDateTime zdt = ZonedDateTime.parse( input , f );
你对年和月感兴趣。java。时间类包括YearMonth类用于此目的。
YearMonth ym = YearMonth.from( zdt );
如果需要,可以查询年份和月份。
int year = ym.getYear();
int month = ym.getMonthValue();
但是toString方法生成标准ISO 8601格式的字符串。
String output = ym.toString();
把这些放在一起。
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();
转储到控制台。
System.out.println( "input: " + input );
System.out.println( "zdt: " + zdt );
System.out.println( "ym: " + ym );
输入:星期三星期三14 16:02:37 GMT 2011
zdt: 2011-03-14T16:02:37Z[GMT]
ym: 2011-03
生活的代码
请参阅在IdeOne.com中运行的代码。
转换
如果必须使用Calendar对象,则可以使用添加到旧类中的新方法将其转换为GregorianCalendar。
GregorianCalendar gc = GregorianCalendar.from( zdt );
关于java.time
java。时间框架内置于Java 8及更高版本中。这些类取代了麻烦的旧遗留日期-时间类,如java.util。日期,日历和简单日期格式。
要了解更多,请参阅Oracle教程。搜索Stack Overflow可以找到很多例子和解释。规范是JSR 310。
Joda-Time项目现在处于维护模式,建议迁移到java。时间类。
你可以交换java。Time对象直接使用数据库。使用符合JDBC 4.2或更高版本的JDBC驱动程序。不需要字符串,不需要java。sql。*类。Hibernate 5和JPA 2.2支持java.time。
从哪里获取java。时间类?
Java SE 8, Java SE 9, Java SE 10, Java SE 11, and later - Part of the standard Java API with a bundled implementation. Java 9 brought some minor features and fixes. Java SE 6 and Java SE 7 Most of the java.time functionality is back-ported to Java 6 & 7 in ThreeTen-Backport. Android Later versions of Android (26+) bundle implementations of the java.time classes. For earlier Android (<26), the process of API desugaring brings a subset of the java.time functionality not originally built into Android. If the desugaring does not offer what you need, the ThreeTenABP project adapts ThreeTen-Backport (mentioned above) to Android. See How to use ThreeTenABP….
其他回答
简单的方法:
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;
}
嗯,我认为复制SimpleDateFormat等类中已经存在的代码是一个坏主意。
另一方面,我个人建议,如果可以的话,完全避免使用Calendar和Date,而使用Joda Time,这是一个设计得更好的日期和时间API。例如,您需要知道SimpleDateFormat不是线程安全的,因此每次使用它时,您要么需要线程局部变量、同步,要么需要一个新实例。Joda解析器和格式化器是线程安全的。
用时区解析时间,模式中的Z为时区
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();
}
输出:它将返回UTC时间
1508899140000
如果我们不像yyyy-MM-dd 't 'HH:mm:ss那样设置时区。SimpleDateFormat将使用在Setting中设置的时区
是的,如果你自己解析它,那将是一种糟糕的做法。看看SimpleDateFormat,它会将字符串转换为日期,您可以将日期设置为日历实例。
博士tl;
现代的方法使用java。时间类。
YearMonth.from(
ZonedDateTime.parse(
"Mon Mar 14 16:02:37 GMT 2011" ,
DateTimeFormatter.ofPattern( "E MMM d HH:mm:ss z uuuu" )
)
).toString()
The 2011-03
避免遗留的日期-时间类
现代的方法是用java。时间类。旧的日期-时间类(如Calendar)已被证明设计糟糕、令人困惑且麻烦。
定义一个自定义格式化程序来匹配字符串输入。
String input = "Mon Mar 14 16:02:37 GMT 2011";
DateTimeFormatter f = DateTimeFormatter.ofPattern( "E MMM d HH:mm:ss z uuuu" );
解析为zone datetime。
ZonedDateTime zdt = ZonedDateTime.parse( input , f );
你对年和月感兴趣。java。时间类包括YearMonth类用于此目的。
YearMonth ym = YearMonth.from( zdt );
如果需要,可以查询年份和月份。
int year = ym.getYear();
int month = ym.getMonthValue();
但是toString方法生成标准ISO 8601格式的字符串。
String output = ym.toString();
把这些放在一起。
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();
转储到控制台。
System.out.println( "input: " + input );
System.out.println( "zdt: " + zdt );
System.out.println( "ym: " + ym );
输入:星期三星期三14 16:02:37 GMT 2011
zdt: 2011-03-14T16:02:37Z[GMT]
ym: 2011-03
生活的代码
请参阅在IdeOne.com中运行的代码。
转换
如果必须使用Calendar对象,则可以使用添加到旧类中的新方法将其转换为GregorianCalendar。
GregorianCalendar gc = GregorianCalendar.from( zdt );
关于java.time
java。时间框架内置于Java 8及更高版本中。这些类取代了麻烦的旧遗留日期-时间类,如java.util。日期,日历和简单日期格式。
要了解更多,请参阅Oracle教程。搜索Stack Overflow可以找到很多例子和解释。规范是JSR 310。
Joda-Time项目现在处于维护模式,建议迁移到java。时间类。
你可以交换java。Time对象直接使用数据库。使用符合JDBC 4.2或更高版本的JDBC驱动程序。不需要字符串,不需要java。sql。*类。Hibernate 5和JPA 2.2支持java.time。
从哪里获取java。时间类?
Java SE 8, Java SE 9, Java SE 10, Java SE 11, and later - Part of the standard Java API with a bundled implementation. Java 9 brought some minor features and fixes. Java SE 6 and Java SE 7 Most of the java.time functionality is back-ported to Java 6 & 7 in ThreeTen-Backport. Android Later versions of Android (26+) bundle implementations of the java.time classes. For earlier Android (<26), the process of API desugaring brings a subset of the java.time functionality not originally built into Android. If the desugaring does not offer what you need, the ThreeTenABP project adapts ThreeTen-Backport (mentioned above) to Android. See How to use ThreeTenABP….