在 Java 中将字符串转换为日历对象
我是 Java 新手,通常使用 PHP。
我正在尝试转换这个字符串:
2011 年 3 月 14 日星期一 16:02:37 GMT
放入日历对象中,以便我可以像这样轻松地提取年份和月份:
String yearAndMonth = cal.get(Calendar.YEAR)+cal.get(Calendar.MONTH);
手动解析它是一个坏主意吗?使用子字符串方法?
任何建议都会有帮助谢谢!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(9)
注意:根据您的环境/要求设置
Locale
另请参阅
note: set
Locale
according to your environment/requirementSee Also
tl;dr
现代方法使用 java.time 类。
避免遗留日期时间类
现代方法是使用 java.time 类。旧的日期时间类(例如
Calendar
)已被证明设计不佳、令人困惑且麻烦。定义自定义格式化程序以匹配您的字符串输入。
解析为
ZonedDateTime
。您对年份和月份感兴趣。 java.time 类包含用于此目的的 YearMonth 类。
如果需要,您可以询问年份和月份数字。
但是
toString
方法会生成标准 ISO 8601 格式的字符串。把这一切放在一起。
转储到控制台。
实时代码
请参阅此代码在 IdeOne.com 中运行。
转换
如果您必须有一个
Calendar
对象,则可以转换为GregorianCalendar
使用添加到旧类的新方法。关于 java.time
java.time 框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧遗留日期时间类,例如
java.util.Date
< /a>, <代码>日历,&SimpleDateFormat< /代码>
。
要了解更多信息,请参阅 Oracle 教程 。并在 Stack Overflow 上搜索许多示例和解释。规范为 JSR 310。
Joda-Time 项目,现已在 维护模式,建议迁移到 java.time 类。
您可以直接与数据库交换java.time对象。使用符合 JDBC 驱动程序 jeps/170" rel="noreferrer">JDBC 4.2 或更高版本。不需要字符串,不需要 java.sql.* 类。 Hibernate 5 和 Hibernate 5 JPA 2.2 支持 java.time。
从哪里获取 java.time 类?
tl;dr
The modern approach uses the java.time classes.
Avoid legacy date-time classes
The modern way is with java.time classes. The old date-time classes such as
Calendar
have proven to be poorly-designed, confusing, and troublesome.Define a custom formatter to match your string input.
Parse as a
ZonedDateTime
.You are interested in the year and month. The java.time classes include
YearMonth
class for that purpose.You can interrogate for the year and month numbers if needed.
But the
toString
method generates a string in standard ISO 8601 format.Put this all together.
Dump to console.
Live code
See this code running in IdeOne.com.
Conversion
If you must have a
Calendar
object, you can convert to aGregorianCalendar
using new methods added to the old classes.About java.time
The java.time framework is built into Java 8 and later. These classes supplant the troublesome old legacy date-time classes such as
java.util.Date
,Calendar
, &SimpleDateFormat
.To learn more, see the Oracle Tutorial. And search Stack Overflow for many examples and explanations. Specification is JSR 310.
The Joda-Time project, now in maintenance mode, advises migration to the java.time classes.
You may exchange java.time objects directly with your database. Use a JDBC driver compliant with JDBC 4.2 or later. No need for strings, no need for
java.sql.*
classes. Hibernate 5 & JPA 2.2 support java.time.Where to obtain the java.time classes?
好吧,我认为复制
SimpleDateFormat
。另一方面,我个人建议如果可以的话完全避免
Calendar
和Date
,并使用Joda Time 相反,它是一个设计得更好的日期和时间 API。例如,您需要注意SimpleDateFormat
不是线程安全的,因此每次使用它时您要么需要线程局部变量、同步,要么需要一个新实例。 Joda 解析器和格式化器是线程安全的。Well, I think it would be a bad idea to replicate the code which is already present in classes like
SimpleDateFormat
.On the other hand, personally I'd suggest avoiding
Calendar
andDate
entirely if you can, and using Joda Time instead, as a far better designed date and time API. For example, you need to be aware thatSimpleDateFormat
is not thread-safe, so you either need thread-locals, synchronization, or a new instance each time you use it. Joda parsers and formatters are thread-safe.不需要创建新的日历,SimpleDateFormat 已经在下面使用了日历。
(我还不能发表评论,这就是我创建新答案的原因)
No new Calendar needs to be created, SimpleDateFormat already uses a Calendar underneath.
(I can't comment yet, that's why I created a new answer)
SimpleDateFormat
很棒,但请注意,在处理小时时,HH
与hh
不同。HH
将返回基于 24 小时的时间,hh 将返回基于 12 小时的时间。例如,以下将返回 12 小时时间:
而这将返回 24 小时时间:
SimpleDateFormat
is great, just note thatHH
is different fromhh
when working with hours.HH
will return 24 hour based hours and hh will return 12 hour based hours.For example, the following will return 12 hour time:
While this will return 24 hour time:
解析带有时区的时间,模式中的
Z
表示时区输出:它将返回 UTC 时间
如果我们不以
等模式设置时区yyyy-MM-dd'T'HH:mm:ss
。SimpleDateFormat
将使用在Setting
中设置的时区Parse a time with timezone,
Z
in pattern is for time zoneOutput: it will return the UTC time
If we don't set the time zone in pattern like
yyyy-MM-dd'T'HH:mm:ss
.SimpleDateFormat
will use the time zone which have set inSetting
是的,自己解析它是不好的做法。看一下SimpleDateFormat,就会变成将字符串转换为日期,您可以将日期设置为日历实例。
Yes it would be bad practice to parse it yourself. Take a look at SimpleDateFormat, it will turn the String into a Date and you can set the Date into a Calendar instance.
简单方法:
Simple method:
我认为这是有效的方法。
例子
I think this is the efficient way.
Example