【问题标题】:is it possible to work with time as a String in java是否可以在java中将时间作为字符串使用
【发布时间】:2020-05-18 17:41:02
【问题描述】:

我正在为学校开发一个 java JFrame 项目。我真的一直在努力使用 java time 包,所以我想知道是否可以在字符串变量中使用 time。

我的程序将制定学习时间表的过程自动化。用户将输入他们拥有的任何活动的开始和结束时间。然后我利用这段时间将它处理成一个字符串hh: mme.g:4 PM 将是16:00)。

        String finalTime="";
        if (dropBox.getSelectedItem().toString().equals("PM")) {
            int time = Integer.parseInt((txt.getText().substring(0,2)));
            time = time + 12;
            finalTime =  Integer.toString(time) + txt.getText().substring(2, 5);
        }
        else {
            finalTime = txt.getText();
        }
        return finalTime;

在他们的活动存储在我的数据库中后,我要求他们输入每次考试的日期。使用这些日期,我为每个考试(字符串主题、java.sql.Date 日期、字符串开始时间、字符串结束时间)制作了不同的“学习时段”。

第一个学习时段正好在考试前三周(或者如果他们在时间较短时创建它,他们的第一个学习时段是在他们制定时间表的那一天),最后一个是考试前一天。

我仍在努力研究如何完成其​​余的工作,但我很可能会为每门考试分配特定数量的学习时段,然后随机确定哪个时段去的时间。

我计划做的是避免在用户输入他们有活动的同时分配学习时段。但是,无论是将时间存储为字符串还是使用 java.time 包,我都无法弄清楚如何执行此操作。任何帮助将不胜感激。

如果我没有提供足够的信息或代码,请告诉我,我对此还是很陌生!

【问题讨论】:

  • @user 不再推荐java.util.Date。现在是 2020 年。至于将时间值用作字符串,这是个坏主意。 java.time 类的整个想法是使日期处理更容易正确完成。如果你自己用字符串做,你会弄错的(这是有保证的)。
  • 我的错。就看时间包(docs.oracle.com/javase/8/docs/api/java/time/…)然后
  • 我建议你不要使用java.sql.Date。该课程设计不良且早已过时。而是使用LocalDate 作为日期,使用LocalTime 作为一天中的时间。两者都来自java.time, the modern Java date and time API

标签: java string time


【解决方案1】:

仅供参考,对于新程序员来说,日历并不是一件容易的事。这项工作比你想象的更棘手和复杂。一方面,您需要非常清楚 (a) 日期与时间和 (b) 时刻之间的区别,正如 What's the difference between Instant and LocalDateTime? 所讨论的那样。


永远不要使用java.util.Date。仅使用 java.time 包中的现代类。

对于一天中的某个时间,请使用LocalTime

LocalTime start = LocalTime.of( 16 , 0 ) ;

通过自动本地化显示给用户。

Locale locale = Locale.CANADA_FRENCH ;  // Or `Locale.US`, `Locale.UK` or such.
DateTimeFormatter f = DateTimeFormatter.ofLocalizedTime( FormatStyle.MEDIUM ).withLocale( locale ) ;
String output = start.format( f ) ;

将考试时段的时间长度指定为Duration

Duration duration = Duration.ofHours( 1 ) ;

通常最好让日程安排应用存储开始时间和持续时间,但不存储结束时间。结局总是可以计算的。

计算结束时间。将持续时间添加到 LocalTime 对象会生成一个新的单独的 LocalTime 对象,而不是更改原始对象 (immutable objects)。

LocalTime end = start.plus( duration ) ;

注意:向LocalTime 添加时间跨度会忽略时区异常问题,例如Daylight Saving Time (DST)。最好将持续时间添加到如下所示的ZonedDateTime 对象。

对于日期,请使用LocalDate

LocalDate ld = LocalDate.of( 2020 , Month.MARCH , 23 ) ;

使用Period 类将时间倒退三周。

Period period = Period.ofWeeks( 3 ) ;
LocalDate examDate = ld.minus( period ) ; // 3 weeks prior.

将日期和时间组合成LocalDateTime

LocalDateTime ldt = LocalDateTime.of( examDate , start ) ;

要确定时间轴上的特定时刻,请提供时区的上下文。你会得到一个ZonedDateTime

ZoneId z = ZoneId.of( "America/Montreal" ) ;
ZonedDateTime zdtStart = ldt.atZone( z ) ;

获取结束时间。

ZonedDateTime zdtEnd = zdtStart.plus( duration ) ;  // Automatically accounts for anomalies such as Daylight Saving Time (DST).

要查看 UTC 中的那个时刻,请提取 Instant

Instant instant = zdt.toInstant() ;

在数据库存储方面,PostgresH2等一些数据库对日期时间数据类型的支持很好。使用符合JDBC 4.2 或更高版本的JDBC driver 通过setObject/getObject 方法交换java.time 对象。

不幸的是,JDBC 4.2 需要支持 OffsetDateTime 而不是更常用的 InstantZonedDateTime 类型。真的没问题,因为我们可以轻松地来回转换。

OffsetDateTime odt = instant.atOffset( ZoneOffset.UTC ) ;

提示:对于此类工作,您可能需要将ThreeTen-Extra 库添加到您的项目中以访问Interval 和/或LocalDateRange 类。它们代表与时间线相关的时间跨度,分别为一对Instant 对象或LocalDate 对象。

我在这里已经很简短了。所有这些已经在 Stack Overflow 上多次介绍过。搜索以了解更多信息。


关于java.time

java.time 框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧 legacy 日期时间类,例如 java.util.DateCalendarSimpleDateFormat

要了解更多信息,请参阅Oracle Tutorial。并在 Stack Overflow 上搜索许多示例和解释。规格为JSR 310

Joda-Time 项目现在位于maintenance mode,建议迁移到java.time 类。

您可以直接与您的数据库交换 java.time 对象。使用符合JDBC 4.2 或更高版本的JDBC driver。不需要字符串,不需要java.sql.* 类。 Hibernate 5 和 JPA 2.2 支持 java.time

从哪里获得 java.time 类?

https://i.stack.imgur.com/eKgbN.png

ThreeTen-Extra 项目通过附加类扩展了 java.time。该项目是未来可能添加到 java.time 的试验场。您可以在这里找到一些有用的类,例如IntervalYearWeekYearQuartermore

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-23
    • 1970-01-01
    • 1970-01-01
    • 2011-05-25
    • 2021-01-08
    • 1970-01-01
    相关资源
    最近更新 更多