Java日期(日历)在给定日期时间的情况下,以本地时间计算一天的开始时间
全部, 在办公室和这个人度过了艰难的一天。。。我尝试在当地时间锻炼一天的开始,即午夜00:00:00,给定任何日历日期 考虑到接下来的几天,我想计算当地时间午夜一天的开始时间:Java日期(日历)在给定日期时间的情况下,以本地时间计算一天的开始时间,java,date,calendar,Java,Date,Calendar,全部, 在办公室和这个人度过了艰难的一天。。。我尝试在当地时间锻炼一天的开始,即午夜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:
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
目前,我正在使用SimpleDataFormat将字符串Time解析为GregorianCalendar。这给了我计算的GMT/UTC时间
因此,我有一些代码将字符串解析为GregoriaCalendar:
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听起来你只是想把所有的时间部分都设置为零。您可以使用:
cal.set(Calendar.HOUR_OF_DAY, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MILLISECOND, 0);
(假设日历中的时区设置正确。)
但请注意,这并不一定有效——在某些时区(例如巴西),在夏令时转换时,午夜可能会出现两次,或者根本不会出现
就我个人而言,我会开始大声疾呼要搬到Joda Time,这让一切变得简单多了:)我认为这段代码可能会解决您的问题。我用它把本地时区的时间转换成另一个时区
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 );
}
希望这有帮助。java.time
您正在使用过时的类。在Java8和更高版本中,使用内置框架
不要假设一天从时间00:00:00.0
开始。由于夏令时(DST)等异常情况,一天的开始时间可能因时区而异。让java.time类通过调用来确定正确的时间
避免使用3-4个字母的区域缩写,如BST
,EST
,等等。它们既不是标准化的,也不是独特的。使用
时间轴上的一个瞬间。应用时区以获取ZoneDateTime
。从该日期时间中提取一个仅限日期的值。通过呼叫应用时区,以返回到该时区中一天中的第一个时刻的集合
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
方法,而不是硬编码一天中的零时间