簡體   English   中英

使用Calendar類在Java中獲取星期幾作為特定日期的字符串

[英]get day of week as a string for a particular date in Java using Calendar class

我想用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));
}

}

此代碼產生以下輸出:

SUNDAY: 1 
MONDAY: 2
TUESDAY: 3
WEDNESDAY: 4
THURSDAY: 5
FRIDAY: 6
SATURDAY: 7
YEAR: 2015
MONTH: 8
DATE: 5
DAY_OF_WEEK: 7
SATURDAY

因為月份是從零開始的。

我應該從月份中減去1。

tl; dr

獲取星期幾作為特定日期的字符串

  • 你太辛苦了
  • 您使用了錯誤的類。

我們可以將您的代碼簡化為一種形式:

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.
)

看到此代碼在IdeOne.com上實時運行

星期二

我建議在嘗試使用此類代碼之前先搜索Stack Overflow。 已經多次詢問並回答這個話題。

java.time

您正在使用麻煩的類,這些類在幾年前被java.time類所取代。 永遠不會再碰那些遺留的類。

將您的輸入字符串解析為僅日期的值,沒有時間,沒有時區。 那將是一個LocalDate對象。

LocalDate ld = LocalDate.of(
    Integer.valueOf( y ) ,    // Sane numbering. Ex: number `2018` is year 2018.
    Integer.valueOf( m ) ,    // Sane numbering. Months 1-12 are January-December.
    Integer.valueOf( d ) 
) ;

使用方便的DayOfWeek枚舉獲取星期幾。 此類預定義了七個對象,一周中的每一天一個。 您還將在該類上找到一些方便的方法,例如下面使用的本地化功能。

Java具有非常強大和靈活的枚舉功能。 如果不熟悉,請學習Oracle教程

DayOfWeek dow = ld.getDayOfWeek() ; 

生成一個星期幾名稱的String 無需對英語進行硬編碼。 java.time自動為您本地化。

要本地化,請指定:

  • TextStyle確定字符串應為多長時間或縮寫。
  • 確定Locale
    • 用於翻譯日名,月名等的人工語言
    • 文化規范決定縮寫,大寫,標點,分隔符等問題。

例:

Locale l = Locale.CANADA_FRENCH ;  // Or, Locale.UK, Locale.US, etc.
String output = dow.getDisplayName( TextStyle.FULL , l ) ;

關於java.time

java.time框架內置於Java 8及更高版本中。 這些類取代了麻煩的舊的舊式日期時間類,例如java.util.DateCalendarSimpleDateFormat

現在處於維護模式Joda-Time項目建議遷移到java.time類。

要了解更多信息,請參見Oracle教程 並在Stack Overflow中搜索許多示例和說明。 規格為JSR 310

您可以直接與數據庫交換java.time對象。 使用與JDBC 4.2或更高版本兼容的JDBC驅動程序 不需要字符串,不需要java.sql.*類。

在哪里獲取java.time類?

ThreeTen-Extra項目使用其他類擴展了java.time。 該項目為將來可能在java.time中添加內容提供了一個試驗場。 您可以在這里找到一些有用的類,比如IntervalYearWeekYearQuarter ,和更多

看看LocalDate並嘗試以下操作:

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());

java.time包中有不錯的類。

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);
}

編輯 :基於來自Ole VV的最新評論程序中沒有錯誤。 只需在我的工作站中重新嘗試它,這是由於月份編號方案基於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)); 

在此部分代碼中,未設置DAY_OF_WEEKDAY_OF_WEEK_IN_MONTH但是...

在方法結束時,我們還是試圖檢索它:

  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); 

因此,實際上,您將獲得DAY_OF_WEEK的默認值7( 參考 ),也就是dow變量的值,因此dow - 1始終為6, dows.get(6)始終返回SATURDAY

嘗試使用Calendar類設置DAY_OF_WEEK_IN_MONTH可能會很棘手。 最好使用Ruben DGsajib建議的java.time包中的功能。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM