- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我将于2018年12月7日运行以下表达式。
我看到了这样的差异:
ZonedDateTime.now(ZoneId.of("America/New_York")).minusDays(30)
2018-11-07T22:44:11.242576-05:00[America/New_York]
ZonedDateTime.now(ZoneId.of("America/New_York")).minusDays(30).toInstant()
2018-11-08T03:58:01.724728Z
... = Date.from(t.toInstant())
datetime.datetime.now('America/New_York')+datetime.timedelta(days=-30)
datetime: 2018-11-07 20:13:55.063888-05:00
`datetime.X = datetime.now(deployment_zone) - (N_days)`,
where `deployment_zone` is configurable (i.e. `America/New_York`)
`N_days` is configurable (i.e. 30)
analytics.time_zone=America/New_York
TIME_ZONE = props.getProperty('analytics.time_zone', 'UTC')
TZ = pytz.timezone(TIME_ZONE)
def days_back(num_days=0):
adjusted_datetime = datetime.datetime.now(TZ)+datetime.timedelta(days=-num_days)
return DateRangeUtil.get_start_of_day(adjusted_datetime)
class DateRangeUtil():
@staticmethod
def get_start_of_day(date):
return date.astimezone(TZ).replace(hour=0, minute=0, second=0, microsecond=0)
datetime: 2018-11-07 20:13:55.063888-05:00
public final static DateRange parse(String dateRange) {
//.....
int days = ...
return new DateRange(toBeginningOfDay(daysBack(days)), toEndOfDay(daysBack(0)));
private final static Date daysBack(int days) {
return toDate(LocalDateTime.now().minusDays(days));
}
private final static Date toBeginningOfDay(Date d)
{
Calendar c=Calendar.getInstance();
c.setTime(d);
c.set(HOUR_OF_DAY,0);
c.set(MINUTE,0);
c.set(SECOND,0);
c.set(MILLISECOND, 0);
return c.getTime();
}
private final static Date toDate(LocalDateTime t) {
return Date.from(t.atZone(ZoneId.systemDefault()).toInstant());
}
private final static Date daysBack(int days) {
return toDate(ZonedDateTime.now(ZoneId.of("America/New_York")).minusDays(days).toLocalDateTime());
private final static Date toDate(LocalDateTime t) {
return Date.from(t.toInstant(ZoneOffset.UTC));
}
private final static Date toDate(LocalDateTime t) {
return Date.from(t.toInstant(ZoneOffset.UTC));
}
private final static Date daysBack(int days) {
return toDate(LocalDateTime.now().minusDays(days));
}
LocalDate
(也许还有
LocalDateTime
)有一个方便的
atStartOfDay()
,似乎是在替换上面的旧版
Date
方法时从图片中消除
toBeginningOfDay(Date d)
的合适人选。不确定它是否在做同样的事情-我尚未尝试过该想法,因此,建议非常受欢迎。
toInstant()
行为开始的,当它传递区域ID时,它是转换为该区域中的即时数据还是从该区域转换为即时数据?
最佳答案
tl; drZonedDateTime.toInstant()
调整从时区到UTC的时间。您最终会获得相同的时刻,不同的时钟时间,以及时间轴上同一同时点的不同日期。您所看到的不是问题,不是差异。
您的问题不在于减去30天。真正的问题:
不了解时区会影响日期
将日期与天合计
此外,您的问题不明确。说“ 30天前”可能意味着至少三件事:
30 * 24小时
范围从三十个日历日前在纽约时区的22:44到现在的纽约时间
如纽约所示,今天一整天,如日历所示,可以追溯到日历的30天。
下面用标有➥
的示例代码介绍了这三种可能性。
⑦🕥🇺🇸📞↔📞🇮🇸⑧🕞
12月7日,午夜(22:44)之前,爱丽丝在纽约的公寓里决定给冰岛雷克雅未克的朋友鲍勃打电话。 Bob简直不敢相信自己的电话在响,看着床头柜上的时钟,时间已经快凌晨4点(03:44)。鲍勃(Bob)花哨的数字时钟将日期显示为12月8日,而不是7月。相同的同时时刻,时间轴上的相同点,不同的时钟时间,不同的日期。
冰岛人民全年都使用UTC作为时区。纽约在2018年12月比UTC落后五个小时,因此比冰岛落后五个小时。在纽约,“昨天”是第七名,在冰岛,是“明天”第八名。不同的日期,同一刻。
因此,忘记减去三十天。每当您在接近午夜的纽约时间,然后调整为UTC时,您都将向前移动日期。
没有差异,没有增加额外的一天。在任何给定时刻,日期都会随时区在全球范围内变化。时区的范围大约为26-27小时,因此总是在“明天”和“昨天”某个地方。
Another Answer建议将LocalDateTime
纳入此问题。这是不明智的。该类故意缺少时区或从UTC偏移的任何概念。这意味着LocalDateTime
不能代表片刻。 LocalDateTime
表示沿上述26-27小时范围内的潜在时刻。在这里涉及该类没有任何意义。
取而代之的是,将OffsetDateTime
用于从UTC偏移量观看的时刻,而[ZonedDateTime][2]
使用时区。
偏移量和区域之间有什么区别?偏移量仅是数小时-分-秒,仅此而已。相比之下,区域更多。区域是特定区域的人们使用的偏移的过去,现在和将来的历史记录。因此,时区总是比单纯的偏移更可取,因为它带来了更多的信息。如果要专门使用UTC,则只需要一个偏移量,即零小时-分钟-秒的偏移量。
OffsetDateTime odt = zdt.toOffsetDateTime().withOffsetSameInstant( ZoneOffset.UTC ) ; // Adjust from a time zone to UTC.
zdt
和
odt
都表示同一时刻,时间轴上的同一点,不同的挂钟时间,如上面的Alice和Bob的示例。
Instant
。此类代表UTC中的时刻,始终是UTC中的时刻。
ZoneId z = ZoneId.of( "America/New_York" ) ;
ZonedDateTime zdtNow = ZonedDateTime.now( z ) ;
Instant instantNow = zdt.toInstant() ; // Adjust from time zone to UTC. Same moment, different wall-clock time.
Instant instantThirtyDaysAgo = instantNow.minus( 30 , ChronoUnit.DAYS ) ; // Subtract ( 30 * 24 hours ) without regard for dates.
Instant
。但是
Instant
是可选的,而
JDBC 4.2和更高版本要求支持
OffsetDateTime
。在这种情况下,让我们重新编写该代码。
ZoneId z = ZoneId.of( "America/New_York" ) ;
ZonedDateTime zdtNow = ZonedDateTime.now( z ) ;
OffsetDateTime odtNow = zdt.toOffsetDateTime().withOffsetSameInstant( ZoneOffset.UTC ) ; // Adjust from time zone to UTC. Same moment, different wall-clock time.
OffsetDateTime odtThirtyDaysAgo = odtNow.minusDays( 30 ) ;
BETWEEN
。
SELECT * FROM event_ WHERE when_ >= ? AND when_ < ? ;
myPreparedStatement.setObject( 1 , odtThirtyDaysAgo ) ;
myPreparedStatement.setObject( 2 , odtNow ) ;
ZoneId z = ZoneId.of( "America/New_York" ) ;
ZonedDateTime zdtNow = ZonedDateTime.now( z ) ;
ZonedDateTime zdtThirtyDaysAgo = zdtNow.minusDays( 30 ) ; // `ZonedDateTime` will try to keep the same time-of-day but will adjust if that time on that date in that zone is not valid.
ZonedDateTime
类将尝试在较早的日期使用同一时间。但是由于夏时制(DST)转换等异常,该时间可能在那个日期的那个日期无效。在这种异常情况下,
ZonedDateTime
类将调整为有效时间。一定要学习JavaDoc来了解算法并查看它是否适合您的业务规则。
myPreparedStatement.setObject( 1 , zdtThirtyDaysAgo ) ;
myPreparedStatement.setObject( 2 , zdtNow ) ;
LocalDate
类专注于仅日期的值,而没有时间和时区。
ZoneId z = ZoneId.of( "America/New_York" ) ;
LocalDate today = LocalDate.now( z ) ;
LocalDate tomorrow = today.plusDays( 1 ) ;
LocalDate thirtyDaysAgo = tomorrow.minusDays( 30 ) ;
ZonedDateTime zdtStart = thirtyDaysAgo.atStartOfDay( z ) ;
ZonedDateTime zdtStop = tomorrow.atStartOfDay( z ) ;
myPreparedStatement.setObject( 1 , zdtStart ) ;
myPreparedStatement.setObject( 2 , zdtStop ) ;
关于java - Java ZonedDateTime.toInstant()行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53679397/
这是我的测试代码,日期 1111-11-11即时方法结果是 1111-11-17 jshell> new Date(-789,10,11) $8 ==> Sat Nov 11 00:00:00 JST
我正在尝试将 Calendar 实例转换为 instant,我正在这样做 Calendar cal = new GregorianCalendar(); System.out.prin
本文整理了Java中java.time.ZonedDateTime.toInstant()方法的一些代码示例,展示了ZonedDateTime.toInstant()的具体用法。这些代码示例主要来源于
我将于2018年12月7日运行以下表达式。 我看到了这样的差异: ZonedDateTime.now(ZoneId.of("America/New_York")).minusDays(30) 返回(正
本文整理了Java中org.threeten.bp.ZonedDateTime.toInstant()方法的一些代码示例,展示了ZonedDateTime.toInstant()的具体用法。这些代码示
当我运行测试时: @RunWith(PowerMockRunner.class) @PrepareForTest(MyStuff.class) public class MyStuffTest { .
java.util.Date 类有一个名为toInstant() 的方法,该方法将Date 实例转换为java。 time.Instant. java.sql.Date 类扩展了 java.util.
我正在开发一部分代码,其中我必须使用日历 API 使用现有的 api,而我使用的是全新的 API。在转换中出现了一些奇怪的行为,请看这个例子: SimpleDateFormat df = new Si
如果我使用java.util.Date的toInstant()在一个恰好是 java.sql.Date 的变量上,我得到一个UnsupportedOperationException 。 try {
我是一名优秀的程序员,十分优秀!