Android:从GregorianCalendar对象获取年、月、日

Android:从GregorianCalendar对象获取年、月、日,android,gregorian-calendar,Android,Gregorian Calendar,GregorianCalendar构造函数要求以下内容: GregorianCalendar(int year, int month, int dayOfMonth); 如何从已创建的对象中提取年、月和日。现在我使用的是object.YEAR、object.MONTH和object.DAY\u OF\u MONTH,但这似乎并没有给出正确的数字 谢谢 这里我得到了一个日期,它基于用户单击的日历日期。然后,用户可以在该日期中输入一些信息,这些信息存储在键入GregoriaCalendar的Has

GregorianCalendar构造函数要求以下内容:

GregorianCalendar(int year, int month, int dayOfMonth);
如何从已创建的对象中提取年、月和日。现在我使用的是object.YEAR、object.MONTH和object.DAY\u OF\u MONTH,但这似乎并没有给出正确的数字

谢谢

这里我得到了一个日期,它基于用户单击的日历日期。然后,用户可以在该日期中输入一些信息,这些信息存储在键入GregoriaCalendar的HashMap中

cal.setOnDateChangeListener(new CalendarView.OnDateChangeListener() {
            @Override
            public void onSelectedDayChange(CalendarView view, int year, int month, int dayOfMonth) {

                selectedDate = new GregorianCalendar(year, month, dayOfMonth);
在这里,我试图将GregorianCalendar年、月和日参数中的日期写入一个文件,以便以后使用

private void writeToFile() {
        try
        {
            PrintWriter writer = new PrintWriter(file, "UTF-8");
            for (GregorianCalendar gregObject: recipes.keySet()) {
                String[] value = recipes.get(gregObject);
                int y = gregObject.YEAR;
                int m = gregObject.MONTH;
                int d = gregObject.DAY_OF_MONTH;

                writer.printf("%d %d %d ", y, m, d);
下面是我如何读取文件的。当我从文件中读取时,我得到了年、月和日期的数字1、2、5,这是错误的。读取的其余信息是正确的

try
            {
                Scanner getLine = new Scanner(file);
                Scanner tokenizer;

                while (getLine.hasNextLine()) {
                    String line = getLine.nextLine();
                    tokenizer = new Scanner(line);
                    System.out.println(line);

                    while (tokenizer.hasNextInt()) {
                        int y1 = tokenizer.nextInt();
                        int m1 = tokenizer.nextInt();
                        int d1 = tokenizer.nextInt();

显然,我认为我在文件中错误地写入了年、月和日,因此我试图找出从GregoriaCalendar对象中提取年、月和日的正确方法

希望以下帮助:我使用2015/06/10作为输入。请注意,月份值为0(一月)-11(十二月)

tl;博士
  • 你工作太辛苦了
  • 您使用的是现在已被现代java.time类取代的麻烦的旧日期时间类
例如:

LocalDate.now().getYear()      // Better to pass a specific time zone (`ZoneId`) as optional argument: LocalDate.now( ZoneId.of( "Africa/Tunis" ) ).getYear()
2018年

java.time 如果您真的只关心日期而不关心时间,请不要使用日期时间类

LocalDate
该类表示一个仅限日期的值,不包含一天中的时间和时区

时区对于确定日期至关重要。在任何一个特定的时刻,世界各地的日期都因地区而异。例如,中午夜后几分钟是新的一天,而中仍然是“昨天”

如果未指定时区,JVM将隐式应用其当前默认时区。该默认值可能随时更改,因此您的结果可能会有所不同。最好将所需/预期时区明确指定为参数

大陆/地区
的格式指定,例如,或
太平洋/奥克兰
。切勿使用3-4个字母的缩写,如
EST
IST
,因为它们不是真正的时区,也不是标准化的,甚至不是唯一的(!)

如果要使用JVM的当前默认时区,请请求它并将其作为参数传递。如果省略,则隐式应用JVM的当前默认值。最好是显式的,因为JVM中任何应用程序的任何线程中的任何代码都可能在运行时的任何时刻更改默认值

ZoneId z = ZoneId.systemDefault() ;  // Get JVM’s current default time zone.
或者指定一个日期。你可以用一个数字来设置月份,1-12月的数字为1-12

LocalDate ld = LocalDate.of( 1986 , 2 , 23 ) ;  // Years use sane direct numbering (1986 means year 1986). Months use sane numbering, 1-12 for January-December.
或者,最好使用预定义的枚举对象,一年中每个月一个。提示:在整个代码库中使用这些
Month
对象,而不仅仅是一个整数,这样可以使代码更加自我记录,确保有效值,并提供更高的可用性

年-月-日部件 根据需要询问零件

int ld.getYear() ;
int ld.getMonthValue() ;
int ld.getDayOfMonth() ;
int zdt.getYear() ;
int zdt.getMonthValue() ;
int zdt.getDayOfMonth() ;
遗留代码 如果必须与尚未转换为java.time的旧代码进行交互操作,则可以使用添加到旧类中的新方法进行转换

gregorianalendar
的等价物是

根据需要询问零件

int ld.getYear() ;
int ld.getMonthValue() ;
int ld.getDayOfMonth() ;
int zdt.getYear() ;
int zdt.getMonthValue() ;
int zdt.getDayOfMonth() ;

关于java.time 该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,例如,&

该项目现已启动,建议迁移到类

要了解更多信息,请参阅。并搜索堆栈溢出以获得许多示例和解释。规格是

从哪里获得java.time类

  • ,及以后
    • 内置的
    • 标准JavaAPI的一部分,带有捆绑实现
    • Java9添加了一些次要功能和修复
    • 大部分java.time功能都在中向后移植到Java6和Java7
    • 更高版本的Android捆绑包实现了java.time类
    • 对于早期的Android,该项目采用了ThreeTen Backport(如上所述)。看

该项目使用其他类扩展了java.time。这个项目是java.time将来可能添加的一个试验场。您可以在这里找到一些有用的类,例如、、和。

它提供了什么数字?你在期待什么?你是如何初始化那个“对象”的?你应该提供更多的信息,因为你的问题太广泛了。用我正在做的更新了。所以你必须创建一个日历对象,以便在以后的程序中获取年、月和日?在你的情况下,否。按照以下方式更新代码:int y=gregObject.get(Calendar.year);int m=gregObject.get(Calendar.MONTH);int d=gregObject.get(日历、月日);writer.printf(“%d%d%d”,y,m+1,d);gregObject.YEAR | gregObject.MONTH | gregObject.DAY_OF_MONTH是GregoriaCalendar类中的标志。要获得实际值,您必须使用@Hari提到的getter。非常感谢!这么简单。。。。文档似乎缺少一些东西。。。
ZonedDateTime zdt = myGregCal.toZonedDateTime() ;  // Convert from legacy class to modern class.
int zdt.getYear() ;
int zdt.getMonthValue() ;
int zdt.getDayOfMonth() ;