我是Java的新手。我有一个时间是从网页上得到的,这是“hh:mm”格式(不是 24 小时)。这对我来说就像一个字符串。然后,我想将此字符串与今天的日期组合在一起,以便制作一个可以使用的 Java 日期
。
在 C# 中:
string s = "5:45 PM";
DateTime d;
DateTime.TryParse(s, out d);
在Java中,我尝试过:
String s = "5:45 PM";
Date d = new Date(); // Which instantiates with the current date/time.
String[] arr = s.split(" ");
boolean isPm = arr[1].compareToIgnoreCase("PM") == 0;
arr = arr[0].split(":");
int hours = Integer.parseInt(arr[0]);
d.setHours(isPm ? hours + 12 : hours);
d.setMinutes(Integer.parseInt(arr[1]));
d.setSeconds(0);
有没有更好的方法来实现我想要的?
要解析时间,你可以像@Jon Skeet的回答中解释的那样做:
String input = "5:45 PM";
DateTimeFormatter parser = DateTimeFormatter.ofPattern("h:mm a", Locale.ENGLISH);
LocalTime time = LocalTime.parse(input, parser);
请注意,我还使用了java.util。区域设置
,因为如果您不指定它,它将使用系统的默认区域设置,并且一些区域设置可以对AM/PM字段使用不同的符号。使用显式语言环境可以避免这种情况(即使在运行时,也可以更改默认语言环境,因此最好使用显式)。
要与今天的日期组合,您需要java.time.LocalDate
(获取日期)并与LocalTime
组合,以获取LocalDateTime
:
// combine with today's date
LocalDateTime combined = LocalDate.now().atTime(time);
然后,您可以使用其他格式化程序设置本地日期时间
的格式:
DateTimeFormatter fmt = DateTimeFormatter.ofPattern("dd/MM/yyyy HH:mm");
System.out.println(combined.format(fmt));
输出为:
16/08/2017 17:45
如果要将 LocalDateTime
转换为 java.util.Date
,则必须注意一些细节。
java.util.Date
表示自1970-01-01T00:00Z
(又名Unix Epoch)以来的毫秒数。这是一个瞬间(特定的时间点)。查看这篇文章了解更多信息。
因此,相同的Date
对象可以表示不同的日期或时间,这取决于你所在的位置:想象一下,现在,此时此刻,世界上的每个人都在同一个瞬间(自1970-01-01T00:00Z以来的相同毫秒数),但世界各地的本地日期和时间不同。
< code>LocalDateTime
表示“本地”的概念:它是一个日期(日、月和年)和一个时间(时、分、秒和纳秒),但与特定的时区没有任何关系。
同一 LocalDateTime
对象可以表示不同时区中的不同时刻。因此,要将其转换为日期
,您必须定义所需的时区。
一种选择是使用系统的默认时区:
// convert to system's default timezone
ZonedDateTime atDefaultTimezone = combined.atZone(ZoneId.systemDefault());
// convert to java.util.Date
Date date = Date.from(atDefaultTimezone.toInstant());
但是默认值可能因系统/环境而异,也可以更改,即使在运行时也是如此。为了不依赖它并对它有更多的控制权,您可以使用显式区域:
// convert to a specific timezone
ZonedDateTime zdt = combined.atZone(ZoneId.of("Europe/London"));
// convert to java.util.Date
Date date = Date.from(zdt.toInstant());
请注意,我使用了< code >欧洲/伦敦。API使用IANA时区名称(格式始终为< code >地区/城市,如< code >美洲/圣保罗或< code >欧洲/柏林)。避免使用3个字母的缩写(如< code>CST或< code>PST),因为它们不明确且不标准。
您可以通过调用 ZoneId.getAvailableZoneIds()
来获取可用时区的列表(并选择最适合您系统的时区)。
还有夏令时的极端情况(当 LocalDateTime
可以存在两次或由于重叠和间隙而无法存在时)。在这种情况下,Jon 使用 ZonedDateTime
的解决方案避免了这个问题)。
有没有更好的方法来实现我想要的?
当然——事实上,在. NET和Java中。在. NET中,我(以一种有偏见的方式)建议使用Noda Time,这样您就可以将一天中的某个时间表示为LocalTime
,准确地解析您期望的模式。
在Java 8中,您可以使用Java.time.LocalTime
执行相同的操作:
import java.time.*;
import java.time.format.*;
public class Test {
public static void main(String[] args) {
String text = "5:45 PM";
DateTimeFormatter format = DateTimeFormatter.ofPattern("h:mm a");
LocalTime time = LocalTime.parse(text, format);
System.out.println(time);
}
}
将文本解析为适当的类型后,您可以将其与其他类型组合。例如,要使用今天的日期和一天中的指定时间在系统时区中获取ZonedDateTime
,您可以使用:
ZonedDateTime zoned = ZonedDateTime.now().with(time);
默认情况下,它使用系统时区和时钟,因此很难进行测试-我建议您输入clock
以获得可测试性。
(野田时代也有类似的事情,但略有不同。如果你需要细节,请告诉我。)
我强烈建议不要使用java.util。Date</code>,它只表示时间上的一个瞬间,并且有一个糟糕的API。
这里的关键点是:
用指定的格式解析文本
- 将文本解析为表示其传达的信息的类型:一天中的某个时间
- 将该值与另一个值组合,该值也应仔细指定(在时钟和时区方面)
所有这些都将导致清晰、可靠、可测试的代码。(而且现有的。NET代码不符合这些要点中的任何一个,IMO。)
本文向大家介绍Java日期时间操作的方法,包括了Java日期时间操作的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了java日期时间基本操作方法,供大家参考,具体内容如下 1. 获得Calendar实例:Calendar c = Calendar.getInstance(); 2. 定义日期/时间的格式:SimpleDateFormat sdf =new SimpleDateF
C++ 标准库没有提供所谓的日期类型。C++ 继承了 C 语言用于日期和时间操作的结构和函数。为了使用日期和时间相关的函数和结构,需要在 C++ 程序中引用 <ctime> 头文件。 有四个与时间相关的类型:clock_t、time_t、size_t 和 tm。类型 clock_t、size_t 和 time_t 能够把系统时间和日期表示为某种整数。 结构类型 tm 把日期和时间以 C 结构的形式
日期与时间 避免使用 DateTime,除非你确实需要处理历法改革(儒略/格里历的改革),此时通过设置 start 参数来明确你的意图。 # 差 - 使用 DateTime 表示当前时间 DateTime.now # 好 - 使用 Time 表示当前时间 Time.now # 差 - 使用 DateTime 表示近现代日期 DateTime.iso8601('2016-06-29') # 好 -
日期与时间 手动设定 可手动设定年/月/日/时/分/秒(12小时制的AM / PM)。 透过因特网设定 经由因特网自动取得日期、时间。 网络联机的详细说明,请参阅(网络设定) > [Infrastructure模式]。 提示 将(设定)>(主题设定) > [颜色]设定为[每月]时,将会于变更[日期与时间]的月份后,自动改变背景颜色。
问题内容: 您实际上如何执行日期时间操作,例如添加日期,查找差异,找出间隔中不包括周末的多少天?我个人开始将这些操作中的一些传递给我的postgresql dbms,因为通常我只需要发出一个sql语句来获得答案,但是,以PHP的方式进行操作,我将不得不编写更多的代码,这意味着更多的机会发生错误… PHP中是否有任何不需要大量代码即可进行日期时间操作的库?在“给定两个日期,两个日期之间有多少个工作日
问题内容: 我有一个脚本,需要在脚本的不同行执行以下命令: 在我的陈述中,我有以下内容: 我收到以下错误: 如果我将语句的顺序更改为: 我收到以下错误: 如果我再次将语句更改为: 我收到以下错误: 这是怎么回事,我怎么都可以工作? 问题答案: 您的麻烦是,您有一些代码希望对 模块 进行引用,而其他代码希望对类进行引用 。 显然,不能两者兼有。 当您这样做时: 您首先要设置为对该类的引用,然后立即将