全,
在办公室里度过了艰难的一天...我正在尝试计算当地时间的一天的开始,即午夜00:00:00,给定任何日历日期。
给定以下几天,我想在当地时间午夜计算一天的开始:
Time Start Day (Local) Start Day (GMT)
2011-03-27 00:00:00 GMT --> 2011-03-27 00:00:00 GMT --> 2011-03-27 00:00:00 GMT
2011-03-27 01:00:00 GMT --> 2011-03-27 00:00:00 GMT --> 2011-03-27 00:00:00 GMT
2011-03-27 02:00:00 GMT --> 2011-03-27 00:00:00 GMT --> 2011-03-27 00:00:00 GMT
2011-04-01 00:00:00 BST --> 2011-04-01 00:00:00 BST --> 2011-03-31 23:00:00 GMT
2011-10-30 00:00:00 BST --> 2011-10-30 00:00:00 BST --> 2011-10-29 23:00:00 GMT
2011-10-30 01:00:00 BST --> 2011-10-30 00:00:00 BST --> 2011-10-29 23:00:00 GMT
2011-10-30 01:00:00 GMT --> 2011-10-30 00:00:00 BST --> 2011-10-29 23:00:00 GMT
2011-11-01 00:00:00 GMT --> 2011-11-01 00:00:00 GMT --> 2011-11-01 00:00:00 GMT目前,我正在使用SimpleDateFormat将字符串Time解析为GregorianCalendar。这为我提供了GMT/UTC时间来进行计算。
因此,我有一些代码可以将字符串解析为GregorianCalendar:
public GregorianCalendar getCalendar(String dateTime) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
GregorianCalendar cal = new GregorianCalendar();
cal.setTime(sdf.parse(dateTime, new ParsePosition(0)));
return cal;
}现在我需要在本地将其设置为午夜:
public void setToStartOfDayLocally(GregorianCalendar cal) {
????
}我不太确定我现在需要用日历做什么。不幸的是,我们不会在不久的将来转向JODA date。我的例子也没有考虑到不同的时区。
有什么想法吗?
谢谢,
Andez
发布于 2011-09-28 23:45:04
我认为这段代码可能会解决你的问题。我正在使用它将本地时区的时间转换为另一个时区。
public static Date convertLocalDateToDateTimezone( Date localDate, String timezone ) {
TimeZone localTimeZone = TimeZone.getDefault();
TimeZone timezone = TimeZone.getTimeZone( timezone );
long gmtMillis = localDate.getTime();
long result = gmtMillis + timezone.getOffset( gmtMillis ) - localTimeZone.getOffset( gmtMillis );
return new Date( result );
}希望这能有所帮助。
发布于 2011-09-28 23:43:10
听起来你只是想把所有的时间部分都设置为零。您可以使用:
cal.set(Calendar.HOUR_OF_DAY, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MILLISECOND, 0);(假设您已经在日历中正确设置了时区。)
请注意,这不一定是有效的-在某些时区(例如巴西),在夏令时转换时,午夜要么发生两次,要么根本不发生。
但就我个人而言,我开始大声疾呼要迁移到Joda Time,这会让这一切变得简单得多:)
发布于 2016-04-01 05:55:54
java.time
您正在使用过时的类。在Java8和更高版本中,使用内置java.time框架。
不要假设一天从时间00:00:00.0开始。由于夏令时(DST)等异常情况,一天的开始时间可能会因时区而异。通过调用LocalDate::atStartOfDay,让java.time类确定正确的时间。
避免使用3-4个字母的区域缩写,如BST、EST等。它们既不是标准化的,也不是唯一的。使用proper time zone names。
在UTC中,Instant是时间线上的一个时刻。应用时区以获取ZonedDateTime。从该date-time中提取一个只有date的值,一个LocalDate。应用一个时区,并调用atStartOfDay以返回到设置为该时区中一天中的第一个时刻的ZonedDateTime。
Instant now = Instant.now();
ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId );
LocalDate localDate = zdt.toLocalDate();
ZonedDateTime zdtStart = localDate.atStartOfDay( zoneId );小贴士:避免使用“午夜”这个词。没有确切的定义。有些人想尝试确定一天中的最后时刻,这是一个问题,因为一秒的无限可除分数。有些人认为特殊的字符串“24:00”表示午夜的钟声,这进一步混淆了日期和时间的处理。Joda-Time项目的经验告诉我们,最好专注于“一天中的第一个时刻”,作为一个清晰而准确的含义。此外,请注意,由于某些时区的夏令时(DST)和其他异常情况,第一时刻并不总是00:00:00。这就是为什么我们依赖于atStartOfDay方法,而不是硬编码一天中的零时间。
https://stackoverflow.com/questions/7585745
复制相似问题