![](/img/trans.png)
[英]Java Calendar using Calendar.DAY_OF_WEEK to get the first and the last dates for a particular date
[英]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。
啊
獲取星期幾作為特定日期的字符串
我們可以將您的代碼簡化為一種形式:
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類所取代。 永遠不會再碰那些遺留的類。
將您的輸入字符串解析為僅日期的值,沒有時間,沒有時區。 那將是一個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自動為您本地化。
要本地化,請指定:
例:
Locale l = Locale.CANADA_FRENCH ; // Or, Locale.UK, Locale.US, etc.
String output = dow.getDisplayName( TextStyle.FULL , l ) ;
java.time框架內置於Java 8及更高版本中。 這些類取代了麻煩的舊的舊式日期時間類,例如java.util.Date
, Calendar
和SimpleDateFormat
。
現在處於維護模式的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中添加內容提供了一個試驗場。 您可以在這里找到一些有用的類,比如Interval
, YearWeek
, YearQuarter
,和更多 。
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_WEEK
或DAY_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 DG和sajib建議的java.time包中的功能。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.