- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个 ZonedDateTime
,它是我使用 DateTimeOffset
和一个时区 ID(字符串)创建的,我还有一个 DateTimeZone
。
我遇到的特殊情况是我需要更改 ZonedDateTime 的 Zone
而无需实际转换时间(即我有 18:00 UTC-4:00,我想将其更改为18:00 UTC-8 相应地转换 18:00)
我发现的唯一相关函数是 .WithZone(DateTimeZone)
但这似乎是根据提供的区域转换我的时间
如何在不转换时间的情况下更改 ZonedDateTime 的“时区”?
编辑我找到了一个似乎有效的解决方案:
private DateTimeOffset myFunction(DateTimeOffset dateTimeOffset, string timeZoneId) {
// get the DateTimeZone (i.e. Etc/GMT)
DateTimeZone timezone = DateTimeZoneProviders.Tzdb[timeZoneId];
// create a new DTO with the previous date/time values, but with the DateTimeZone Offset
var newDTO = new DateTimeOffset(dateTimeOffset.DateTime, timezone.GetUtcOffset(SystemClock.Instance.GetCurrentInstant()).ToTimeSpan());
// create a ZonedDateTime based on the new DTO
var nodaDTO = ZonedDateTime.FromDateTimeOffset(newDTO);
// the correct datetime in the correct zone
var finalProduct = nodaDTO.WithZone(timezone);
return finalProduct.ToDateTimeOffset();
}
最佳答案
如评论中所述,执行此操作的愿望通常表明上游有问题 - 如果您可以在那里修复它,您应该这样做。
如果您最终遇到 DateTimeOffset
的情况,其中本地部分绝对正确但偏移量不正确,并且您确实无法更早地修复数据,那么您将需要找到该本地时间的正确 UTC 偏移量。重要的是要注意本地时间可能不明确(如果它发生在“后退”转换期间)或被跳过(如果它发生在“向前跳转”转换期间),您应该弄清楚在这种情况下该怎么做。
您可以为此使用 DateTimeZone.MapLocal
:
private DateTimeOffset myFunction(DateTimeOffset dateTimeOffset, string timeZoneId)
{
var unspecifiedDateTime = DateTime.SpecifyKind(dateTimeOffset.DateTime, DateTimeKind.Unspecified);
var zone = DateTimeZoneProviders.Tzdb[timeZoneId];
var local = LocalDateTime.FromDateTime(unspecifiedDateTime);
ZoneLocalMapping mapping = zone.MapLocal(local);
// Read documentation for details of this; you can easily detect the
// unambiguous/ambiguous/skipped cases here. You should decide what to do with them.
ZoneInterval mappedInterval = mapping.EarlyInterval;
TimeSpan bclOffset = mappedInterval.WallOffset.ToTimeSpan();
return new DateTimeOff(unspecifiedDateTime, bclOffset);
}
关于c# - 如何在不转换时间的情况下更改 ZonedDateTime 的时区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56656931/
我创建了两个 ZonedDateTime 对象,我认为它们应该相等: public static void main(String[] args) { ZoneId zid = ZoneId.
假设我有一个 ZonedDateTime: ZonedDateTime zonedDateTime = ZonedDateTime.of(LocalDateTime.now(), ZoneI
给定以下单元测试: @Test public void zonedDateTimeCorrectlyRestoresItself() { // construct a new instance
我正在尝试将 ZonedDateTime 与以下代码进行比较: val now = ZonedDateTime.now() val query = for { x Timestamp.from(
我最近迁移到 Java 8,希望能更轻松地处理本地和分区时间。 但是,在我看来,在解析简单日期时,我遇到了一个简单的问题。 public static ZonedDateTime convertirA
您好,我已经搜索过类似的问题,但没有成功。我正在调用一个 ws,它将一个 token 发回给我,当它是有效的示例时: { "token": ..., "notBefore":"Thu 21
我有一个 ZonedDateTime 对象,我想根据给定的区域设置对其进行格式化。 IE。在美国,我希望格式为“M-dd-yy”,但在英国则应为“dd-M-yy”。 在给定的语言环境下执行此操作的最佳
在比较 ZonedDateTimes 时,使用 和 == 并不总是与使用 .isBefore、.isAfter 和 isEqual 相同,如下面的 Kotlin 示例所示: import java.
我有以下功能 public String getDateAndTimeInUserFormat(String value, DateTimeFormat inputFormat) { retu
我的时间以毫秒为单位,我需要将其转换为 ZonedDateTime 对象。 我有以下代码 long m = System.currentTimeMillis(); LocalDateTime d =
我尝试将字符串转换为 ZonedDateTime。这是我的代码: String startTime = "Wed Mar 21 2018 08:00:00 GMT 0330 (IRST)"; Stri
在比较 ZonedDateTimes 时,使用 和 == 并不总是与使用 .isBefore、.isAfter 和 isEqual 相同,如下面的 Kotlin 示例所示: import java.
我正在尝试获取存储为 UTC 的日期时间并将其转换为给定时区的日期时间。据我所知,ZonedDateTime 是正确的(“美国/芝加哥”比 UTC 晚 5 小时),但 DateTimeFormatte
我需要将字符串 2020-04-15T23:00:00+0000 转换为 ZonedDateTime。我尝试了以下方法,但没有成功: DateTimeFormatter formatter = Dat
如何将已设置的 ZonedDateTime 时间更改为“java.time.LocalTime.MIN”或“java.time.LocalTime.MAX”? ZonedDateTime date =
我正在尝试将字符串转换为 ZonedDateTime。 我尝试过以下操作: SimpleDateFormat zonedDateTimeFormat = new SimpleDateFormat("y
我目前正在研究日期在英国夏令时间之内和之外时的 ZonedDateTime 行为。 英国夏令时间从 3 月 25 日开始,增加一小时 (+1)。 我创建了几个 ZonedDateTime 实例(UTC
ZonedDateTime zdt3 = ZonedDateTime.parse("1999-09-09 09:09:09.999", DateTimeFormatter.of
我有一个返回年、月、日和小时的 DTO。因此将值从 DTO 传递到 ZonedDateTime.of 方法。此处,时间显示为太平洋标准时间上午 10 点。因此,尝试将其转换为 UTC。 当传递月份为
String ip="2011-05-01T06:47:35.422-05:00"; ZonedDateTime mzt = ZonedDateTime.parse(ip).toInstant().a
我是一名优秀的程序员,十分优秀!