当前位置: 首页 > 知识库问答 >
问题:

C# 与 Java 中的日期时间操作

雍焱
2023-03-14

我是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);

有没有更好的方法来实现我想要的?

共有2个答案

齐成和
2023-03-14
匿名用户

要解析时间,你可以像@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 的解决方案避免了这个问题)。

卢俭
2023-03-14

有没有更好的方法来实现我想要的?

当然——事实上,在. 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中是否有任何不需要大量代码即可进行日期时间操作的库?在“给定两个日期,两个日期之间有多少个工作日

  • 问题内容: 我有一个脚本,需要在脚本的不同行执行以下命令: 在我的陈述中,我有以下内容: 我收到以下错误: 如果我将语句的顺序更改为: 我收到以下错误: 如果我再次将语句更改为: 我收到以下错误: 这是怎么回事,我怎么都可以工作? 问题答案: 您的麻烦是,您有一些代码希望对 模块 进行引用,而其他代码希望对类进行引用 。 显然,不能两者兼有。 当您这样做时: 您首先要设置为对该类的引用,然后立即将