【问题标题】:Printing Time and Date in both Universal Time and Standard Time以通用时间和标准时间打印时间和日期
【发布时间】:2015-11-21 08:40:00
【问题描述】:

编写一个将用户输入带入时间和日期类的 Java 应用程序,但我不知道如何获取此用户输入并将其转换为通用时间和标准时间...我花了几个小时在网上冲浪和堆栈溢出,一直没能找到解决办法。

我有小时、分钟、秒、年、月、日都在单独的整数变量中,需要以通用和标准时间显示它们。

感谢您的观看...

【问题讨论】:

  • 你的变量中有哪一个? UTC,还是当地时间?
  • “标准时间”究竟是什么意思?我怀疑您的意思是某个特定时区的“当地时间”-哪个时区?您的小时/分钟/秒/年/月/日是表示开始的通用时间还是当地时间?

标签: java


【解决方案1】:

有两种解决方案: 首先是将所有输入放在字符串中并解析它:

String dateStr = ""
//put your input in this string in some format/ example:
//dateSttr = year + "." + month + "." + day + " " + hour + ":" + minute;
//It is better to use StringBuilder

DateFormat inputFormat = new SimpleDateFormat("yyyy.MM.dd hh:mm");
//note that hh is 12h-format and HH is 24h-format
DateFormat outputFormat1 = new SimpleDateFormat("your_outputFormat");
DateFormat outputFormat2 = new SimpleDateFormat("your_another_outputFormat");
Date date = inputFormat.parse(dateStr);
String o1, o2;
o1 = outputFormat1.format(date);
o2 = outputFormat2.format(date);
//o1 and o2 is your result.

有关规则,如何完成这种格式,请参阅javadoc

第二种解决方案是获取新日期并设置参数:

Calendar cln = Calendar.getInstance().clear(); 
//by default you get a calendar with current system time

//now set the fields. for example, day:
cln.set(Calendar.YEAR, 2015);
cln.set(Calendar.MONTH, Calendar.FEBRUARY);
cln.set(Calendar.DAY_OF_MONTH, 17);
cln.set(Calendar.HOUR_OF_DAY, 18);//Calendar.HOUR for 12h-format
cln.set(Calendar.MINUTE, 27);

javadoc 中查看有关设置日历的更多信息 请注意,在第二个变体中,您可能有一些字段未定义。

【讨论】:

  • 谢谢,我能够使用您的部分代码来构建解决方案
【解决方案2】:

如果@JonSkeet 的假设和我的假设是正确的,那么您将从 UTC 或您的本地时间开始。显示它只是格式化输出的问题。

对于另一种类型的时间,您可以增加或减少小时数,您可以在网络上找到这些时间。棘手的部分是,这可能会将您推到下一个日历日,或者将您拉回到前一个日历日。为了解决这个问题,我想你想要么

  1. 为年、月、日、小时实现加法器——或

  2. 将它们转换为十进制值(例如,Excel 使用天数,在我写这篇文章时,它是 42328.08813),将值移动适当的小时数,然后将其转换回来。

【讨论】:

  • 感谢您抽出宝贵时间回答,您的建议帮助我找到了答案。
【解决方案3】:

java.time

TEXHIKThe Answer 是正确的,但已过时。另外,正如其他人提到的,我不知道您所说的“通用和标准时间”是什么意思。但我会尽量让你走上正轨。

从 Java 8 开始,旧的 java.util.Date/.Calendar 类已被新的 java.time 框架取代。新类的灵感来自非常成功的Joda-Time 框架,该框架旨在作为其继任者,在概念上相似但经过重新架构。由JSR 310 定义。由ThreeTen-Extra 项目扩展。请参阅Tutorial

ZonedDateTime 类有一个工厂方法,用于获取年、月等数字。

另外,您必须指定time zone。如果您的数字代表UTC 中的日期时间,请使用ZoneOffset.UTC 常量。对于其他时区,使用适当的时区名称指定ZoneId 对象;切勿使用 3-4 个字母的代码,例如 ESTIST,因为它们既不标准化也不独特。

ZoneId zoneId = ZoneId.of( "America/Montreal" );
// ZoneId zoneId = ZoneOffset.UTC; // ZoneOffset is a subclass of ZoneId.
ZonedDateTime zdt = ZonedDateTime.of( 2015 , 1 , 2 , 3 , 4 , 5 , 6 , zoneId );

zdt: 2015-01-02T03:04:05.000000006-05:00[美国/蒙特利尔]

您可以转换为 UTC 或其他时区。

ZonedDateTime zdt_Kolkata = zdt.withZoneSameInstant ( ZoneId.of("Asia/Kolkata") );
ZonedDateTime zdt_Utc = zdt.withZoneSameInstant ( ZoneOffset.UTC );

zdt_Kolkata:2015-01-02T13:34:05.000000006+05:30[亚洲/加尔各答]

zdt_Utc: 2015-01-02T08:04:05.000000006Z

如果使用尚未针对 java.time 更新的类,请转换为 java.util.Date。首先提取一个Instant 对象,时间轴上的时刻总是在UTC。

java.util.Date date = java.util.Date.from ( zdt.toInstant () );

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-08
    • 1970-01-01
    • 2013-06-16
    • 2017-07-23
    相关资源
    最近更新 更多