Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java日期(日历)在给定日期时间的情况下,以本地时间计算一天的开始时间_Java_Date_Calendar - Fatal编程技术网

Java日期(日历)在给定日期时间的情况下,以本地时间计算一天的开始时间

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:

全部,

在办公室和这个人度过了艰难的一天。。。我尝试在当地时间锻炼一天的开始,即午夜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
目前,我正在使用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
方法,而不是硬编码一天中的零时间