根据日期计算星期小算法

根据日期计算星期的公式有很多,下面介绍一个比较著名的——蔡勒(Zeller)公式,即w=y+[y/4]+[c/4]-2c+[26(m+1)/10]+d-1。

公式中的符号含义如下:C是世纪数减一,y是年份后两位,M是月份,d是日数。1月和2月要按上一年的13月和14月来算,这时C和y均按上一年取值。

算出来的W除以7,余数是几就是星期几。如果余数是0,则为星期日。
这里需要注意:我在测试的时候发现有些日期算出来的w除以7的结果是负数(-1~-6),这时需要加7.

下面通过一个实例来演示:

Activity:

package com.home.week;

import java.util.Calendar;

import android.app.Activity;
import android.app.DatePickerDialog;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.DatePicker;
import android.widget.TextView;

public class MainActivity extends Activity implements OnClickListener {
	private Button setBtn;
	private TextView showDateText;
	private TextView showWeekText;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		setBtn = (Button) findViewById(R.id.activity_main_btn);
		setBtn.setOnClickListener(this);
		showDateText = (TextView) findViewById(R.id.activity_main_tv_show_date);
		showWeekText = (TextView) findViewById(R.id.activity_main_tv_show_week);
	}

	@Override
	public void onClick(View v) {
		getDateAndWeek();
	}

	/**
	 * 弹出日期对话框并获取选择的日期和星期
	 */
	private void getDateAndWeek() {
		Calendar c = Calendar.getInstance();
		int year = 0;
		int mouth = 0;
		int day = 0;
		if (!"".equals(showDateText.getText().toString())) {
			String date = showDateText.getText().toString();
			String[] strs = date.split("-");
			year = Integer.parseInt(strs[0]);
			mouth = Integer.parseInt(strs[1]) - 1;
			day = Integer.parseInt(strs[2]);
		} else {
			year = c.get(Calendar.YEAR);
			mouth = c.get(Calendar.MONTH);
			day = c.get(Calendar.DAY_OF_MONTH);
		}
		// 直接创建一个DatePickerDialog对话框实例,并将它显示出来
		new DatePickerDialog(MainActivity.this,
				new DatePickerDialog.OnDateSetListener() {

					@Override
					public void onDateSet(DatePicker view, int year,
							int monthOfYear, int dayOfMonth) {
						showDateText.setText(year + "-" + (monthOfYear + 1)
								+ "-" + dayOfMonth);
						int c = year / 100;
						int d = dayOfMonth;
						int y = year % 100;
						int m = monthOfYear + 1;
						if (m == 1 || m == 2) {
							y = year - 1;
							m = monthOfYear + 12;
						}
						// 运用Zeller公式计算星期
						int w = (y + (y / 4) + (c / 4) - 2 * c
								+ (26 * (m + 1) / 10) + d - 1) % 7;
						if (w < 0) {
							w += 7;
						}
						if (monthOfYear == 0 || monthOfYear == 1) {
							w += 2;
						}
						if (w >= 7) {
							w = w % 7;
						}
						String week = null;
						switch (w) {
						case 0:
							week = "日";
							break;
						case 1:
							week = "一";
							break;
						case 2:
							week = "二";
							break;
						case 3:
							week = "三";
							break;
						case 4:
							week = "四";
							break;
						case 5:
							week = "五";
							break;
						case 6:
							week = "六";
							break;
						default:
							break;
						}
						showWeekText.setText("星期" + week);
					}
				}
				// 设置初始日期
				, year, mouth, day).show();
	}
}

布局XML:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >


    <Button
        android:id="@+id/activity_main_btn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:text="设置日期" />

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="20dp" >

        <TextView
            android:id="@+id/activity_main_tv_show_date_prompt"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerHorizontal="true"
            android:text="日期:" />

        <TextView
            android:id="@+id/activity_main_tv_show_date"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="30dp"
            android:layout_toRightOf="@id/activity_main_tv_show_date_prompt" />
    </RelativeLayout>

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="20dp" >

        <TextView
            android:id="@+id/activity_main_tv_show_week_prompt"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerHorizontal="true"
            android:text="星期:" />

        <TextView
            android:id="@+id/activity_main_tv_show_week"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="30dp"
            android:layout_toRightOf="@id/activity_main_tv_show_week_prompt" />
    </RelativeLayout>

</LinearLayout>




 

 




 

你可能感兴趣的:(android,蔡勒公式,计算星期)