Java 日历的设置值没有给出预期的日期时间

2023-11-26

我有一个小时、分钟、日期和毫秒时间戳,并且正在尝试创建一个表示时间的 Date 对象。时间戳以东部夏令时间提供。

在剖析这个问题时,我创建了一些简单的测试代码来查看发生了什么,并观察到以下情况:

    Date today = new Date();
    int hour = 4, min  = 0, sec  = 0, ms   = 64;
    boolean print = true;

    Calendar cal = GregorianCalendar.getInstance();
    if(print)
        System.out.println("After initializing, time is: "+cal.getTime());
    cal.clear();
    if(print)
        System.out.println("After clearing, time is: "+cal.getTime());
    cal.setTime(today);
    if(print)
        System.out.println("After setting date, time is: "+cal.getTime());
    cal.set(Calendar.HOUR_OF_DAY,hour);
    if(print)
        System.out.println("After setting hour, time is: "+cal.getTime());
    cal.set(Calendar.MINUTE,min);
    if(print)
        System.out.println("After setting minute, time is: "+cal.getTime());
    cal.set(Calendar.SECOND,sec);
    if(print)
        System.out.println("After setting second, time is: "+cal.getTime());
    cal.set(Calendar.MILLISECOND,ms);
    if(print)
        System.out.println("After setting milliseconds, time is: "+cal.getTime());
    cal.setTimeZone(TimeZone.getTimeZone("EDT"));

    System.out.println("After setting time zone, time is: "+cal.getTime());

这会产生输出:

After initializing, time is: Tue Jan 07 16:01:59 EST 2014
After clearing, time is: Thu Jan 01 00:00:00 EST 1970
After setting date, time is: Tue Jan 07 16:01:59 EST 2014
After setting hour, time is: Tue Jan 07 04:01:59 EST 2014
After setting minute, time is: Tue Jan 07 04:00:59 EST 2014
After setting second, time is: Tue Jan 07 04:00:00 EST 2014
After setting milliseconds, time is: Tue Jan 07 04:00:00 EST 2014
After setting time zone, time is: Tue Jan 07 04:00:00 EST 2014

但是,如果我稍微更改一下代码:

boolean print = false;

我得到以下(不同的)结果(!)

After setting time zone, time is: Mon Jan 06 23:00:00 EST 2014

有谁知道为什么会发生这种情况?


正如 gtgaxiola 所提到的:日历文档

在下面现场操控部分:

set(f, value) 将日历字段 f 更改为值。此外,它还设置一个内部成员变量来指示日历字段 f 已更改。尽管日历字段 f 会立即更改,但直到下一次调用 get()、getTime()、getTimeInMillis()、add() 或 roll() 时,才会重新计算日历的时间值(以毫秒为单位)。

问题是你的getTime()调用重新计算日期,但 setTimeZone(..) 未设置内部成员变量isTimeSet为假。因此,第一个输出中的最后一行对您来说是错误的,因为您希望考虑时区,但事实并非如此。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java 日历的设置值没有给出预期的日期时间 的相关文章

随机推荐

  • Unicode 到 UTF-8

    我正在使用 vbscript 从 db2 提取数据并写入文件 写入文件如下 Set objTextFile objFSO CreateTextFile sFilePath True True 以 unicode 创建文件 但那是 xml 文
  • 如何将 android.graphics.Color 转换为 androidx.compose.ui.graphics.Color

    我正在绘制 Jetpack ComposeCanvas Canvas modifier modifier clipToBounds val colorEvaluator ArgbEvaluator colorEvaluator evalua
  • Inno Setup:如何更改背景颜色

    有没有办法将 Inno Setup 底部面板的背景颜色更改为白色 感谢您的帮助 您描述的底部面板实际上是向导表单的区域 因此您只需设置Color的财产WizardForm对象本身 Code procedure InitializeWizar
  • 我应该在 ARC 的 init 方法中引用 self.property 吗?

    一个简单的问题 如果我有一个属性和一个同名声明的 ivar 在 h文件中 Reminder reminder property nonatomic strong Reminder reminder 在 m 文件中 如果我使用 ARC 我应该
  • 通用 querydsl orderBy 具有左连接的动态路径生成

    我在使用 JPA 与 Querydsl 和 Hibernate 进行数据存储管理时遇到了问题 样例模型如下 Entity public class User ManyToOne JoinColumn name CATEGORY ID pri
  • IE https CORS XHR 请求失败,并显示 Script7002:XMLHttpRequest:网络错误 0x2eff

    在所有其他非 IE 浏览器中 以下代码片段效果很好 在两个不同的 IE11 浏览器 在不同的操作系统版本
  • 使用 BeautifulSoup CSS 选择器获取文本

    HTML 示例 h2 ABC span class numbers 123 span span class lower abc span h2 我可以通过以下方式获取数字 soup select name gt span numbers 0
  • 同一类型的多个对象集

    我尝试在 EF5 RC 中创建与此类似的数据上下文 class WordContext DbContext public DbSet
  • Javascript 类型数组和字节顺序

    我正在使用 WebGL 渲染二进制编码的网格文件 二进制文件以大端格式写入 我可以通过在十六进制编辑器中打开文件或使用 fiddler 查看网络流量来验证这一点 当我尝试使用 Float32Array 或 Int32Array 读取二进制响
  • NSNotificationCenter 选择器未被调用

    在我的 iPad 应用程序中 我在一堂课中注册了一条通知 NSNotificationCenter nc NSNotificationCenter defaultCenter nc addObserver self selector sel
  • 如何更改Android顶部工具栏菜单项图标大小

    如何更改 Android 工具栏中菜单项的大小 目前菜单的尺寸非常小 我想增加尺寸 如果有人知道请帮助我找到解决方案 应用程序栏 xml
  • 验证访问令牌 - Asp.Net 身份

    我正在使用 ASP Net Identity 来实现外部登录 用户使用 Google 登录后 我获得了 google 的外部访问令牌 然后我进行第二次 api 调用获取LocalAccessToken 它将外部访问令牌换成新的本地访问令牌
  • Android 如何获取两个时区之间的时差?

    我需要获取不同时区的两个日期之间的时差 目前我正在这样做 Calendar c1 Calendar getInstance TimeZone getTimeZone EDT Calendar c2 Calendar getInstance
  • 适用于 Windows 和 Linux 的 Go 中的命名管道

    我是 Go 新手 我想在 Go 中创建命名管道实现 它可以在 Windows 和 Linux 上运行 我设法让代码在 Ubuntu 上运行 但是这个代码在 Windows 上不起作用 Go 中是否没有任何抽象允许您在两种环境中使用命名管道
  • 如何使用 React Native 强制用户更新应用程序

    我已经在应用程序和 Play 商店中更新了我的应用程序 并且我想强制我的应用程序用户在应用程序商店和 Play 商店中更新应用程序的新版本 您可以使用此库检查应用程序的 App Store Play Store 版本反应本机应用商店版本检查
  • JSON对象到文档

    您好 我是 mongodb 新手 我想将 JSONObject 转换为文档 然后将其存储到 mongodb 这是我编码的内容 我得到了一个 json 格式的服务 api CloseableHttpResponse response http
  • 禁用来自NotificationChannel的声音

    今天我开始瞄准 API 26 这迫使我使用通知通道 我的问题是 现在每个新通知 包括更新 都会播放烦人的声音 如何禁用此声音 我尝试用自定义 mp3 声音替换此声音 然后将其传递为静音的 mp3 但这被忽略 我只是添加一个优先级非常低的通知
  • 如何在加载实际内容之前加载小占位符图像

    我有一个关于图像加载样式的问题 如图所示http www e flux com 该网站首先 随机 加载特定图案的图像 然后再继续显示实际图像 我的猜测是 这是在加载整个网站之前就拥有视觉上令人愉悦的内容 我查看了源代码 发现它有一类 laz
  • 如何从 xml 文件中删除 BOM 字符 [重复]

    这个问题在这里已经有答案了 我正在使用 xsl 来控制 xml 文件的输出 但正在添加 BOM 字符 vim file xml set nobomb wq
  • Java 日历的设置值没有给出预期的日期时间

    我有一个小时 分钟 日期和毫秒时间戳 并且正在尝试创建一个表示时间的 Date 对象 时间戳以东部夏令时间提供 在剖析这个问题时 我创建了一些简单的测试代码来查看发生了什么 并观察到以下情况 Date today new Date int