面对Calendar对象的问题

时间:2015-01-23 07:03:59

标签: java android date time calendar

我有一个任务,我需要以编程方式将小时,分钟,子午线设置为Calendar对象,并且需要以hh:mm a格式显示时间。以下是我目前的代码。

Calendar calendar = (Calendar)dateNtime.clone();
        calendar.set(Calendar.HOUR, 12);
        calendar.set(Calendar.MINUTE, 0);
        calendar.set(Calendar.AM_PM, 1);

SimpleDateFormat dateFormat = new SimpleDateFormat("hh:mm a");
    String str = dateFormat.format(calendar.getTimeInMillis());

其中dateNTime是我必须用于构建新日历对象的现有日历对象。

一切都很顺利,除了我设定12PM的情况。它始终格式化为hh:mm a,结果为12:00 AM,而应该是12:00 PM。

如果有任何人对Calendar对象有很好的体验并且已知问题,请提供帮助,如果有良好的教程链接,请提供给我。

2 个答案:

答案 0 :(得分:5)

HOUR字段为documented

  

获取和设置的字段编号,表示上午或下午的小时。小时用于12小时制(0 - 11)。

因此,不应将其设置为12,而应将其设置为0。

就我个人而言,我只需设置HOUR_OF_DAY字段,如果您想将其设为PM,则添加12小时 - 并且根本不设置AM_PM字段。

答案 1 :(得分:1)

java.time

wanted_breed = ['アメリカンショートヘア','ブリティッシュショートヘア'] df['breed_pool'] = [x if x in wanted_breed else 'others' for x in df['breed']] sns.set(font='Yu Gothic') fig,ax=plt.subplots() g=sns.lineplot(x = "price", y = "Age", hue = 'breed_pool', units = 'breed', estimator = None, palette = 'Set2', data = df,ax=ax) g.legend(loc='center right', bbox_to_anchor=(1.6, 0.8), ncol=1) plt.xticks(np.arange(0,500000,100000),rotation=90) plt.show() 日期时间 API 及其格式化 API java.util 已过时且容易出错。建议完全停止使用它们并切换到 modern Date-Time API*

使用现代 API SimpleDateFormat 的解决方案:

java.time

输出:

import java.time.LocalTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Locale;

public class Main {
    public static void main(String[] args) {
        // Replace JVM's default timezone, ZoneId.systemDefault() with the applicable
        // timezone e.g. ZoneId.of("America/New_York")
        ZonedDateTime zdt = ZonedDateTime.now(ZoneId.systemDefault())
                            .withHour(12)
                            .withMinute(0);
        System.out.println(zdt);

        // Get and display just time in default format
        LocalTime time = zdt.toLocalTime();
        System.out.println(time);

        // Display just time in a custom format
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("hh:mm a", Locale.ENGLISH);
        // Alternatively, dtf.format(time);
        String formatted = dtf.format(zdt);
        System.out.println(formatted);
    }
}

ONLINE DEMO

如何将 2021-06-06T12:00:15.855986+01:00[Europe/London] 12:00:15.855986 12:00 PM 类型转换为 Calendar 类型?

java.time

如果我需要 Instant instant = calendar.toInstant(); // Replace JVM's default timezone, ZoneId.systemDefault() with the applicable // timezone e.g. ZoneId.of("America/New_York") ZonedDateTime zdt = instant.atZone(ZoneId.systemDefault()); 类型的 Calendar 对象怎么办?

出于任何原因,如果您需要将 java.time 的这个对象转换为 ZonedDateTime 的对象,您可以这样做:

java.util.Calendar

modern Date-Time API 中详细了解 Calendar calendar = Calendar.getInstance(); calendar.setTime(Date.from(zdt.toInstant())); Trail: Date Time*

有时,评论会被删除,因此会在下面引用 Ole V.V. 的宝贵评论:

<块引用>

要更准确地转换为 java.time,您可以使用 Calendar


* 出于任何原因,如果您必须坚持使用 Java 6 或 Java 7,您可以使用 ThreeTen-Backport,它将大部分 java.time 功能向后移植到 Java 6 & 7. 如果您正在为 Android 项目工作并且您的 Android API 级别仍然不符合 Java-8,请检查 Java 8+ APIs available through desugaringHow to use ThreeTenABP in Android Project