首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Java Date (Calendar)在给定日期时间的情况下以本地时间计算一天的开始

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

Stack Overflow用户
提问于 2011-09-28 23:37:17
回答 3查看 4.7K关注 0票数 1

全,

在办公室里度过了艰难的一天...我正在尝试计算当地时间的一天的开始,即午夜00:00:00,给定任何日历日期。

给定以下几天,我想在当地时间午夜计算一天的开始:

代码语言:javascript
运行
复制
       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:

代码语言:javascript
运行
复制
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;
}

现在我需要在本地将其设置为午夜:

代码语言:javascript
运行
复制
public void setToStartOfDayLocally(GregorianCalendar cal) {
    ????
}

我不太确定我现在需要用日历做什么。不幸的是,我们不会在不久的将来转向JODA date。我的例子也没有考虑到不同的时区。

有什么想法吗?

谢谢,

Andez

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-09-28 23:45:04

我认为这段代码可能会解决你的问题。我正在使用它将本地时区的时间转换为另一个时区。

代码语言:javascript
运行
复制
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 );
}

希望这能有所帮助。

票数 0
EN

Stack Overflow用户

发布于 2011-09-28 23:43:10

听起来你只是想把所有的时间部分都设置为零。您可以使用:

代码语言:javascript
运行
复制
cal.set(Calendar.HOUR_OF_DAY, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MILLISECOND, 0);

(假设您已经在日历中正确设置了时区。)

请注意,这不一定是有效的-在某些时区(例如巴西),在夏令时转换时,午夜要么发生两次,要么根本不发生。

但就我个人而言,我开始大声疾呼要迁移到Joda Time,这会让这一切变得简单得多:)

票数 0
EN

Stack Overflow用户

发布于 2016-04-01 05:55:54

java.time

您正在使用过时的类。在Java8和更高版本中,使用内置java.time框架。

不要假设一天从时间00:00:00.0开始。由于夏令时(DST)等异常情况,一天的开始时间可能会因时区而异。通过调用LocalDate::atStartOfDay,让java.time类确定正确的时间。

避免使用3-4个字母的区域缩写,如BSTEST等。它们既不是标准化的,也不是唯一的。使用proper time zone names

UTC中,Instant是时间线上的一个时刻。应用时区以获取ZonedDateTime。从该date-time中提取一个只有date的值,一个LocalDate。应用一个时区,并调用atStartOfDay以返回到设置为该时区中一天中的第一个时刻的ZonedDateTime

代码语言:javascript
运行
复制
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方法,而不是硬编码一天中的零时间。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7585745

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档