我来自PHP背景,但学习Android,所以请原谅我,如果这太基础了。
我有三个变量,分别包含小时、分钟和上午/下午。如何将其转换为unix时间戳,以便以秒为单位获得组合值?
String hours = String.valueOf(hourBox.getText()); // may contain a value like 05
String minutes = String.valueOf(minuteBox.getText()); // may contain a value like 45
String ampm = String.valueOf(ampmBox.getText()); // may contain a value like PM or AM
// PHP way
$timestamp = date('Y-m-d '.$hours.':'.$minutes.' '.$ampm);
echo strtotime($timestamp);
// What would be the equivalent of this in Java?
应该使用LocalDateTime:
String hours = "05";
String minutes = "45";
String ampm = "PM";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd hh:mm a");
LocalDateTime dateTime = LocalDateTime.parse(String.format("20160101 %s:%s %s", hours, minutes, ampm), formatter);
System.out.println(dateTime);
如果你还没有LocalDateTime,你可以使用SimpleDateFormat:
String hours = "05";
String minutes = "45";
String ampm = "PM";
SimpleDateFormat format = new SimpleDateFormat("hh:mm a");
Date dateTime = format.parse(String.format("%s:%s %s", hours, minutes, ampm));
System.out.println(dateTime);
如你所见,代码几乎是一样的。
如果要保留当前日期,请切换到日历:
String hours = "05";
String minutes = "45";
String ampm = "PM";
Calendar calendar = GregorianCalendar.getInstance();
calendar.setTime(new Date());
calendar.set(Calendar.HOUR, Integer.parseInt(hours));
calendar.set(Calendar.MINUTE, Integer.parseInt(minutes));
calendar.set(Calendar.AM_PM, "AM".equals(ampm) ? 0 : 1);
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd hh:mm a");
System.out.println(format.format(calendar.getTime()));
Soshin的《The Answer》很好。但我个人会把日期和时间分开处理。
LocalDate
DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern( "uuuuMMdd" );
LocalDate ld = LocalDate.parse( "20160101" , dateFormatter );
LocalTime
和一天中的时间。不需要AM/PM部分;格式化代码指示期望的时间是12小时制还是24小时制。
DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern( "hhmm" ); // hh = two digits of 12-hour time (1-12). mm = minute-of-hour.
LocalDate ld = LocalDate.parse( hours + minutes , timeFormatter ); // 0545 in afternoon.
LocalDateTime
您可以将它们组合成一个LocalDateTime
。
LocalDateTime ldt = LocalDateTime.of( ld , lt );
ZonedDateTime
如果您确定该值的预期时区,则应用ZoneId
来获得ZonedDateTime
。
ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ldt.atZone( z );
A LocalDateTime
没有意义;如果没有utc的偏移量或时区,它就不是一个实际的时刻。相比之下,ZonedDateTime
确实是时间轴上的一个实际点。
java。时间框架内置于Java 8及以后版本中。这些类取代了麻烦的旧的遗留日期时间类,如java.util.Date
, .Calendar
, &java.text.SimpleDateFormat
.
Joda-Time项目,现在处于维护模式,建议迁移到java.time.
要了解更多信息,请参阅Oracle教程。并搜索Stack Overflow以获得许多示例和解释。规格为JSR 310。
从哪里获取java。时间类?
- Java SE 8和SE 9及以后版本
- 内置。
- 标准Java API的一部分,捆绑实现。
Java 9增加了一些小的特性和修复。
- 大部分java。时间功能向后移植到Java 6;7在 ThreeTen-Backport 。
- ThreeTenABP项目适应ThreeTen-Backport(上面提到的)Android。
three - ten - extra项目扩展了java。有额外课程的时间。这个项目是将来可能添加到java.time的试验场。您可以在这里找到一些有用的类,如Interval
、YearWeek
、YearQuarter
等。