Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/402.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Calendar类获取Java中特定日期的星期几字符串_Java_Calendar - Fatal编程技术网

使用Calendar类获取Java中特定日期的星期几字符串

使用Calendar类获取Java中特定日期的星期几字符串,java,calendar,Java,Calendar,我想用Java做这个简单的事情。正确答案应该是“星期三”。这有什么问题?我从Calendar类的文档中获取了这个示例 import java.util.*; import java.lang.Integer; class Dumb { public static List<String> dows = Collections.unmodifiableList(Arrays.asList("SUNDAY","MONDAY","TUESDAY","WEDNESDAY","THURS

我想用Java做这个简单的事情。正确答案应该是“星期三”。这有什么问题?我从Calendar类的文档中获取了这个示例

import java.util.*;
import java.lang.Integer;

class Dumb {
  public static List<String> dows = Collections.unmodifiableList(Arrays.asList("SUNDAY","MONDAY","TUESDAY","WEDNESDAY","THURSDAY","FRIDAY","SATURDAY"));

  public static String getDay(String day, String month, String year) {
   // get the supported ids for GMT-08:00 (Pacific Standard Time)
   String[] ids = TimeZone.getAvailableIDs(-8 * 60 * 60 * 1000);
   // if no ids were returned, something is wrong. get out.
   if (ids.length == 0)
       System.exit(0);
   // create a Pacific Standard Time time zone
   SimpleTimeZone pdt = new SimpleTimeZone(-8 * 60 * 60 * 1000, ids[0]);
   // set up rules for Daylight Saving Time
   pdt.setStartRule(Calendar.APRIL, 1, Calendar.SUNDAY, 2 * 60 * 60 * 1000);
   pdt.setEndRule(Calendar.OCTOBER, -1, Calendar.SUNDAY, 2 * 60 * 60 * 1000);

   // create a GregorianCalendar with the Pacific Daylight time zone
   // and the desired date and time
   Calendar calendar = new GregorianCalendar(pdt);
   calendar.set(Calendar.MONTH, Integer.valueOf(month));
   calendar.set(Calendar.DAY_OF_MONTH, Integer.valueOf(day));
   calendar.set(Calendar.YEAR, Integer.valueOf(year)); 

   // print out a bunch of interesting things
   System.out.println("SUNDAY: " + calendar.SUNDAY);
   System.out.println("MONDAY: " + calendar.MONDAY);
   System.out.println("TUESDAY: " + calendar.TUESDAY);
   System.out.println("WEDNESDAY: " + calendar.WEDNESDAY);
   System.out.println("THURSDAY: " + calendar.THURSDAY);
   System.out.println("FRIDAY: " + calendar.FRIDAY);
   System.out.println("SATURDAY: " + calendar.SATURDAY);
   System.out.println("YEAR: " + calendar.get(Calendar.YEAR));
   System.out.println("MONTH: " + calendar.get(Calendar.MONTH));
   System.out.println("DATE: " + calendar.get(Calendar.DATE));
   System.out.println("DAY_OF_WEEK: " + calendar.get(Calendar.DAY_OF_WEEK));
  int dow = calendar.get(Calendar.DAY_OF_WEEK);
  return dows.get(dow-1);
    }
}

public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    String month = in.next();
    String day = in.next();
    String year = in.next();

    System.out.println(getDay(day, month, year));
}

因为这个月是以零为基础的

我应该从这个月减去1


argh

因为月份是以零为基础的

我应该从这个月减去1


argh

Java日期时间问题已在java8 DateTime中修复。 使用下面的代码。你的问题会解决的

public static String getDay(String day, String month, String year) {
    return LocalDate.parse(day+"-"+month+"-"+year , DateTimeFormatter.ofPattern( "dd-MM-yyyy" ))
            .getDayOfWeek()
            .getDisplayName(TextStyle.FULL_STANDALONE , Locale.ENGLISH);
}

Java日期时间问题已在java8 DateTime中修复。 使用下面的代码。你的问题会解决的

public static String getDay(String day, String month, String year) {
    return LocalDate.parse(day+"-"+month+"-"+year , DateTimeFormatter.ofPattern( "dd-MM-yyyy" ))
            .getDayOfWeek()
            .getDisplayName(TextStyle.FULL_STANDALONE , Locale.ENGLISH);
}
看一看 试试这个:

Scanner in = new Scanner(System.in);
String month = in.next();
String day = in.next();
String year = in.next();
LocalDate ld = LocalDate.of(Integer.parseInt(year), Integer.parseInt(month), Integer.parseInt(day));
System.out.println(ld.getDayOfWeek());
软件包中有很多不错的课程。

看看并 试试这个:

Scanner in = new Scanner(System.in);
String month = in.next();
String day = in.next();
String year = in.next();
LocalDate ld = LocalDate.of(Integer.parseInt(year), Integer.parseInt(month), Integer.parseInt(day));
System.out.println(ld.getDayOfWeek());
软件包中有很好的类。

编辑:基于Ole V.V.的最新评论。程序中没有错误。只是在我的工作站上重新尝试了一下,这是因为月份编号方案是基于0的,而不是slashdottir突出显示的1

我认为程序中可能有逻辑错误

// create a GregorianCalendar with the Pacific Daylight time zone
// and the desired date and time
   Calendar calendar = new GregorianCalendar(pdt);
   calendar.set(Calendar.MONTH, Integer.valueOf(month));
   calendar.set(Calendar.DAY_OF_MONTH, Integer.valueOf(day));
   calendar.set(Calendar.YEAR, Integer.valueOf(year));
在这部分代码中,未设置周中的天或月中的周中的天,但

在方法的末尾,我们仍在尝试检索它:

 System.out.println("DAY_OF_WEEK: " + calendar.get(Calendar.DAY_OF_WEEK));
 int dow = calendar.get(Calendar.DAY_OF_WEEK);
 return dows.get(dow-1);
因此,您基本上得到了一周中的第天的默认值,即7,也是道琼斯指数变量的值,因此道琼斯指数-1将始终为6,而dows.get6将始终在周六返回

尝试用Calendar类设置一个月中的一周中的一天可能会很棘手。最好使用Ruben DG和sajib建议的java.time包中的功能。

编辑:基于Ole V.V.的最新评论。程序中没有错误。只是在我的工作站上重新尝试了一下,这是因为月份编号方案是基于0的,而不是slashdottir突出显示的1

我认为程序中可能有逻辑错误

// create a GregorianCalendar with the Pacific Daylight time zone
// and the desired date and time
   Calendar calendar = new GregorianCalendar(pdt);
   calendar.set(Calendar.MONTH, Integer.valueOf(month));
   calendar.set(Calendar.DAY_OF_MONTH, Integer.valueOf(day));
   calendar.set(Calendar.YEAR, Integer.valueOf(year));
在这部分代码中,未设置周中的天或月中的周中的天,但

在方法的末尾,我们仍在尝试检索它:

 System.out.println("DAY_OF_WEEK: " + calendar.get(Calendar.DAY_OF_WEEK));
 int dow = calendar.get(Calendar.DAY_OF_WEEK);
 return dows.get(dow-1);
因此,您基本上得到了一周中的第天的默认值,即7,也是道琼斯指数变量的值,因此道琼斯指数-1将始终为6,而dows.get6将始终在周六返回

尝试用Calendar类设置一个月中的一周中的一天可能会很棘手。最好使用Ruben DG和sajib建议的java.time包中的功能。

tl;博士 将星期几作为特定日期的字符串获取

你工作太辛苦了。 您使用了错误的类。 我们可以将您的代码缩减为一行:

LocalDate.of(                    // A date-only value, without time-of-day, without time zone.
    Integer.valueOf( "2018" ) ,  // Sane numbering. Ex: number `2018` is year 2018.
    Integer.valueOf( "1" ) ,     // Sane numbering. Months 1-12 are January-December.
    Integer.valueOf( "23" ) 
)                                // Returns a `LocalDate` object.
.getDayOfWeek()                  // Returns a `DayOfWeek` enum object.
.getDisplayName(                 // Calls a method on the enum object to automatically localize the name of the day-of-week.
    TextStyle.FULL ,             // Specify how long or abbreviated.
    Locale.US                    // Locale determines the human language and cultural norms used in localization.
)
看这个

星期二

我建议在处理此类代码之前先搜索堆栈溢出。这个话题已经被问过很多次了

java.time 您正在使用非常麻烦的类,这些类在几年前被java.time类取代。永远不要再碰那些遗留类

将输入字符串解析为仅限日期的值,不带时间和时区。这将是一个LocalDate对象

使用方便的枚举获取星期几。这个类预先定义了七个对象,一周中的每一天一个。您还可以在该类上找到一些方便的方法,例如下面使用的本地化功能

Java有一个非常强大和灵活的枚举工具。如果不熟悉,请学习

生成一个包含星期几名称的字符串。不需要硬编码英语。让java.time为您自动本地化

要本地化,请指定:

确定字符串的长度或缩写。 确定: 翻译日名、月名等的人类语言。 决定缩写、大写、标点、分隔符等问题的文化规范。 例如:

Locale l = Locale.CANADA_FRENCH ;  // Or, Locale.UK, Locale.US, etc.
String output = dow.getDisplayName( TextStyle.FULL , l ) ;
关于java.time 该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,例如,&

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

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

您可以直接与数据库交换java.time对象。使用兼容的或更高版本。不需要字符串,也不需要java.sql.*类

从哪里获得java.time类

然后 内置的。 标准JavaAPI的一部分,带有捆绑实现。 Java9添加了一些次要功能和修复。 和 大部分java.time功能都在中向后移植到Java6和Java7。 更高版本的Android捆绑包实现了java.time类。 对于早期的Android tl;博士 将星期几作为特定日期的字符串获取

你工作太辛苦了。 您使用了错误的类。 我们可以将您的代码缩减为一行:

LocalDate.of(                    // A date-only value, without time-of-day, without time zone.
    Integer.valueOf( "2018" ) ,  // Sane numbering. Ex: number `2018` is year 2018.
    Integer.valueOf( "1" ) ,     // Sane numbering. Months 1-12 are January-December.
    Integer.valueOf( "23" ) 
)                                // Returns a `LocalDate` object.
.getDayOfWeek()                  // Returns a `DayOfWeek` enum object.
.getDisplayName(                 // Calls a method on the enum object to automatically localize the name of the day-of-week.
    TextStyle.FULL ,             // Specify how long or abbreviated.
    Locale.US                    // Locale determines the human language and cultural norms used in localization.
)
看这个

星期二

我建议在处理此类代码之前先搜索堆栈溢出。这个topi c已经被问过很多次了

java.time 您正在使用非常麻烦的类,这些类在几年前被java.time类取代。永远不要再碰那些遗留类

将输入字符串解析为仅限日期的值,不带时间和时区。这将是一个LocalDate对象

使用方便的枚举获取星期几。这个类预先定义了七个对象,一周中的每一天一个。您还可以在该类上找到一些方便的方法,例如下面使用的本地化功能

Java有一个非常强大和灵活的枚举工具。如果不熟悉,请学习

生成一个包含星期几名称的字符串。不需要硬编码英语。让java.time为您自动本地化

要本地化,请指定:

确定字符串的长度或缩写。 确定: 翻译日名、月名等的人类语言。 决定缩写、大写、标点、分隔符等问题的文化规范。 例如:

Locale l = Locale.CANADA_FRENCH ;  // Or, Locale.UK, Locale.US, etc.
String output = dow.getDisplayName( TextStyle.FULL , l ) ;
关于java.time 该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,例如,&

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

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

您可以直接与数据库交换java.time对象。使用兼容的或更高版本。不需要字符串,也不需要java.sql.*类

从哪里获得java.time类

然后 内置的。 标准JavaAPI的一部分,带有捆绑实现。 Java9添加了一些次要功能和修复。 和 大部分java.time功能都在中向后移植到Java6和Java7。 更高版本的Android捆绑包实现了java.time类。
对于早期的Android仅供参考,非常麻烦的旧日期时间类,例如,和java.text.simpleDataFormat,现在被内置到java 8和更高版本中的类所取代。请参见.FYI,非常麻烦的旧日期时间类,如,和java.text.simpleDataFormat,现在被java 8和更高版本中内置的类所取代。看,你不能因为一个写得不好的库而谴责整个平台。事实上,几十年来,整个信息技术都忽略了日期-时间处理这一重要主题。第一次认真尝试开发一个强大而复杂的日期时间库是,它碰巧是用Java编写的,主要由Stephen Colebourne编写。他继续从中学习,制定了行业领先的日期-时间框架。你会发现java.time与…java捆绑在一起。你不能因为一个写得不好的库而谴责整个平台。事实上,几十年来,整个信息技术都忽略了日期-时间处理这一重要主题。第一次认真尝试开发一个强大而复杂的日期时间库是,它碰巧是用Java编写的,主要由Stephen Colebourne编写。他继续从中学习,制定了行业领先的日期-时间框架。您会发现java.time与…java捆绑在一起。@BasilBourque-同意。我只是试图在我的工作站上重现这个错误,并用我观察到的内容进行了回应,同时强调了社区其他成员的回应:很好。我收回我的评论。我建议现在添加一个关于这些类是遗留类的说明。谢谢您的建议:从下一次开始,我将强调包括这些观点。但是,在本例中,我不认为我需要添加任何内容,因为您的回答非常全面,并提供了解决方案以及背景细节:有缺陷的答案。日历将从月份、月份和年份中计算周中的天和月中的周中的天。不过,我同意使用日历可能很棘手,而且最好使用java.time.@OleV.V.-谢谢你指出这一点。当我查看文档时,我只是假设这是一个我们需要显式设置但不是真正设置的属性。我已根据您的回答编辑了我的答案:@巴塞尔堡-同意。我只是试图在我的工作站上重现这个错误,并用我观察到的内容进行了回应,同时强调了社区其他成员的回应:很好。我收回我的评论。我建议现在添加一个关于这些类是遗留类的说明。谢谢您的建议:从下一次开始,我将强调包括这些观点。但是,在本例中,我不认为我需要添加任何内容,因为您的回答非常全面,并提供了解决方案以及背景细节:有缺陷的答案。日历将从月份、月份和年份中计算周中的天和月中的周中的天。不过,我同意使用日历可能很棘手,而且最好使用java.time.@OleV.V.-谢谢你指出这一点。当我查看文档时,我只是假设 这是一个我们需要显式设置的属性,但不是真的。我已根据您的回答编辑了我的答案: