如何使用 java Instant 将 18 作为当月的一天

How can I add 18 as day to current month using java Instant

提问人:Cork Kochi 提问时间:12/2/2022 最后编辑:OneCricketeerCork Kochi 更新时间:12/2/2022 访问量:147

问:

我可以使用以下方式获取当前日期

 Instant.now()

我想要得到18-<current month>-<current year>

java java-time java.time.instant

评论

1赞 Jesse 12/2/2022
这回答了你的问题吗?如何在java.time.Instant中获取和设置指定的时间?
2赞 Anonymous 12/2/2022
YearMonth.now(ZoneId.systemDefault()).atDay(18).
3赞 Anonymous 12/2/2022
不能用于日期、日期。顾名思义,是一个时间点。在那个时间点上,世界的时区是两个甚至三个不同的日期。InstantInstant
0赞 Michael 12/2/2022
索尔斯克亚说的没错。但是假设您想要 UTC 的 18 号,那么.或者,也许您应该一直处理 ZonedDateTime。这真的取决于你用它来做什么instant.atZone(ZoneOffset.UTC).withDayOfMonth(18).toInstant()
1赞 Michael 12/2/2022
@CorkKochi 很抱歉直言不讳,但评论中的代码是胡言乱语。YearMonth.atDay 为您提供 LocalDate。您无法单独根据日期创建即时信息。即时不仅仅是一个约会。似乎您并没有真正理解这些类旨在表示的不同概念。我建议通读这篇文章:oracle.com/technical-resources/articles/java/......

答:

1赞 Basil Bourque 12/2/2022 #1

TL的;博士

YearMonth                             // Represents a year and month only, no day of month. 
.now( 
    ZoneId.of( "America/Edmonton" )   // Returns a `ZoneId` object. 
)
.atDay( 18 )                          // Returns a `LocalDate` object. 
.format(
    DateTimeFormatter
    .ofPattern( "dd-MM-uuuu" )
)                                     // Returns a `String` object. 

正如 Ole V.V. 的评论所解释的那样,您使用了错误的类。这里不需要。Instant

  • 要表示日期,请使用 。LocalDate
  • 若要表示年份和月份,请使用 。YearMonth

捕获当前年月。

这样做需要一个时区。对于任何给定时刻,日期在全球范围内因时区而异。因此,本月在日本东京可能同时是“下个月”,而在俄亥俄州托莱多可能是“上个月”。

ZoneId z = ZoneId.of( "Pacific/Auckland" ) ;
YearMonth ym = YearMonth.now( z ) ;

如果希望当前月份与 UTC 的偏移量为 0 小时-分钟-秒,请使用常量。ZoneOffset.UTC

YearMonth ym = YearMonth.now( ZoneOffset.UTC ) ;

应用一个月中的某一天来获取日期。

LocalDate ld = ym.atDay( 18 ) ;

生成标准 ISO 8601 格式的文本。

String output = ld.toString() ;

生成特定格式的文本。

DateTimeFormatter f = DateTimeFormatter.ofPattern( "dd-MM-uuuu" ) ;
String output = ld.format( f ) ;

评论

1赞 Michael 12/2/2022
通常的策略是在输入完;)提交
0赞 Basil Bourque 12/2/2022
@Michael 在 iPad 上用拇指在 Stack Overflow 的片状文本编辑器中打字时不会。早存钱,经常存钱。
3赞 Arvind Kumar Avinash 12/2/2022 #2

我赞同Basil Bourque的回答。但是,如果您要查找对象,可以通过将 UTC 的电流调整到每月的 18 日来获取它,如下所示:InstantOffsetDateTime

public class Main {
    public static void main(String[] args) {
        Instant thisInstantOn18th = OffsetDateTime.now(ZoneOffset.UTC)
                                    .with(ChronoField.DAY_OF_MONTH, 18)
                                    .toInstant();
        System.out.println(thisInstantOn18th);
    }
}

输出

2022-12-18T19:19:20.128313Z

Trail: Date Time 了解有关新式日期时间 API 的更多信息。

评论

0赞 Anonymous 12/2/2022
这是有可能的。我们不知道 OP 是否想要 UTC )我可能认为这不太可能),我们也不知道他们是否想要当天 UTC 的当前时间(正如您给他们的那样)。也许他们这样做了。
1赞 Arvind Kumar Avinash 12/2/2022
@OleV.V.这是有道理的。但是,我的答案是基于这样的假设,即 OP 希望将 18 日视为输出中的月中的某一天,而保持其他单位不变。这就是我选择UTC的原因。