คอมพิวเตอร์ Windows อินเทอร์เน็ต

กี่วันในเดือนพฤษภาคม การกำหนดจำนวนวันในหนึ่งเดือนใน Microsoft Excel การคำนวณจำนวนวันระหว่างวันที่

เมื่อเร็ว ๆ นี้หลังจากไม่ได้นอนเป็นเวลานาน ฉันคิดว่าคุณจะรู้จำนวนวันในหนึ่งเดือนได้อย่างไรโดยรู้จำนวนวันของมัน มีเพลงกล่อมเด็กในหัวข้อนี้มีวิธีนับด้วยข้อนิ้ว แต่วิธีการเหล่านี้ไม่เหมาะกับฉัน - ฉันรีบค้นหาสูตรทางคณิตศาสตร์ซึ่งฉันได้รับหลังจากนั้นครู่หนึ่ง

ดังนั้นภารกิจ

กล่าวอีกนัยหนึ่งเราต้องได้รับฟังก์ชัน f (x) ที่จะให้รายการค่าต่อไปนี้ (ซึ่งโดยวิธีการที่ฉันพบที่ไหนสักแห่งบนอินเทอร์เน็ตและไม่ได้อนุมานโดยใช้กฎช่วยในการจำ):

ควรสังเกตว่าเป็นอาร์กิวเมนต์ที่เราได้รับเฉพาะจำนวนเดือนนั่นคือ เราไม่นับปีอธิกสุรทินและ ฉ (2) = 28.

หากคุณต้องการทราบผลลัพธ์ที่ฉันได้รับ ให้เลื่อนไปที่ด้านล่างของหน้านี้ สิ่งที่จะอธิบายด้านล่างนี้คือที่มาของสูตรที่ต้องการ

เราจะใช้อะไร

นอกจากการบวก การลบ และการคูณ ฉันจะใช้การดำเนินการสองอย่าง: การหารจำนวนเต็มและเศษเหลือ ฉันขอเตือนคุณว่ามันคืออะไร:

  • หารจำนวนเต็มหรือ "หารแล้วปัดเศษ" ฉันจะแสดงเป็นส่วนปกติ: a / b - หมายถึง ⌊a / b⌋ ตัวอย่างเช่น 5/3 = 1
  • นำโมดูโลที่เหลือมา... ฉันจะแสดงถึงการหารแบบดั้งเดิมด้วยเศษ: a% b = a - (a / b) * b ตัวอย่างเช่น 5% 3 = 2

พวกเขามีลำดับความสำคัญเท่ากันและถูกปล่อยให้เชื่อมโยงกัน

พื้นฐานหรือกฎที่มีข้อยกเว้นมากมาย

ลองหารูปแบบที่จะตอบสนองค่าของการโต้แย้งให้ได้มากที่สุด โดยปกติจำนวนวันในหนึ่งเดือนจะผันผวนระหว่าง 30 ถึง 31 ในเวลาเดียวกัน คุณสามารถสังเกตเห็นการพึ่งพาของตัวเลขนี้บนความเท่าเทียมกันของเดือน - ดังนั้น เราจะใช้การดำเนินการของการรับโมดูโล 2 ที่เหลือ ดูเหมือนว่าควรเป็นดังนี้:

f₁ (x) = 30 + x% 2


เริ่มดี! เพิกเฉยในเดือนกุมภาพันธ์ซึ่งแน่นอนว่าจะต้องมีเล่ห์เหลี่ยมอยู่บ้าง เราดีใจที่เราสามารถปรับฟังก์ชันสำหรับครึ่งปีแรกได้ จากนั้นในเดือนสิงหาคม ความเท่าเทียมกันจะต้องเปลี่ยนไปในทางตรงข้าม สามารถทำได้โดยเปลี่ยน x% 2ในรุ่นแรกของสูตร on (x + 1)% 2:

f₂ (x) = 30 + (x + 1)% 2


ตามที่คาดไว้ ตอนนี้ครึ่งแรกของปีอยู่นอกช่วงของค่าที่ถูกต้องแล้ว แต่เดือนตั้งแต่เดือนสิงหาคมถึงธันวาคมได้ให้สิ่งที่เราต้องการ ลองหาวิธีรวมสองส่วนนี้เข้าด้วยกัน

หน้ากาก

เราต้องการ +1 ในเงินปันผลเพื่อ "เปิดใช้งาน" เฉพาะเมื่ออาร์กิวเมนต์ถึงค่าที่มากกว่า 8 นั่นคือ เราจำเป็นต้องทาหน้ากาก ในกรณีนี้ ค่าของอาร์กิวเมนต์ต้องไม่เกิน 12 ดังนั้น การหารจำนวนเต็มของอาร์กิวเมนต์ด้วย 8 จึงเหมาะอย่างยิ่งสำหรับเรา:


ตรงตามที่เราต้องการ ลองใช้ข้อสรุปนี้:

f₃ (x) = 30 + (x + x / 8)% 2


ว้าว! ทุกอย่างถูกต้อง ยกเว้นเดือนกุมภาพันธ์ อย่างคาดไม่ถึง

กุมภาพันธ์

ทุกเดือนมี 30 หรือ 31 วันในเดือนกุมภาพันธ์ - 28 (จำไว้ว่าเราไม่พิจารณาปีอธิกสุรทิน)

ข้อมูลอ้างอิงทางประวัติศาสตร์: ในปฏิทินโรมัน กุมภาพันธ์เป็นเดือนสุดท้ายของปี - คุณต้องยอมรับว่าการเพิ่มวันในปีอธิกสุรทินต่อท้ายปฏิทินนั้นง่ายกว่า อย่างไรก็ตาม เราใช้ปฏิทินเกรกอเรียนซึ่งเดือนที่สั้นที่สุดจะถูกย้ายเข้ามาใกล้จุดเริ่มต้นมากขึ้นตามเจตจำนงของผู้ปกครองที่ฉลาดท่านหนึ่ง

มากที่สุด รุ่นล่าสุดสูตรของเรามี 30 วันในเดือนกุมภาพันธ์ ดังนั้นเราจึงต้องตัดขาดจากเขาสองสามวัน แน่นอน อีกหลายเดือนจะต้องทนทุกข์ทรมานจากสิ่งนี้ ไม่ว่าจะเป็นด้านซ้ายของเดือนกุมภาพันธ์หรือทางด้านขวาในรายการของเรา อย่างไรก็ตาม ทางขวาของเดือนนั้นมีน้อยกว่ามาก ดังนั้นเราจะต้องเสียสละในเดือนมกราคม แล้วจึงปรับสูตร สำหรับมัน. คุณสามารถตัดวันที่สำหรับเดือนแรกและเดือนที่สองโดยใช้นิพจน์ 2% x.

บันทึก: โพสต์นี้เป็นคำแปลของบทความ cmcenroe.me/2014/12/05/days-in-month-formula.html ( ส่วนที่ 1) เช่นเดียวกับการเพิ่มของผู้เขียน ( ส่วนที่II). คุณไม่ควรจริงจังกับเนื้อหานี้ แต่เป็นการวอร์มอัพสำหรับจิตใจ ไม่ต้องการอะไรมากไปกว่าความรู้ทางคณิตศาสตร์ของโรงเรียนและไม่มีการนำไปใช้จริง มีความสุขในการอ่านทุกคน!

ส่วนที่ 1

บทนำ

เมื่อเร็ว ๆ นี้หลังจากนอนไม่หลับอีกคืนหนึ่ง ฉันกำลังคิดเกี่ยวกับวิธีการจำจำนวนวันในแต่ละเดือนของปี สำหรับสิ่งนี้มีเครื่องนับเช่นเดียวกับวิธีการนับบนสนับมือ แต่ก็ไม่มีใครเหมาะกับฉัน ฉันสงสัยว่ามีสูตรทางคณิตศาสตร์บางประเภทสำหรับการแก้ปัญหาดังกล่าวหรือไม่ และ - ไม่พบสูตรที่มีการศึกษาคร่าวๆ - ฉันท้าทายตัวเองให้สร้างมันขึ้นมา

การจัดรูปแบบ กล่าวอีกนัยหนึ่ง จำเป็นต้องค้นหาฟังก์ชัน NSเพื่อให้ค่า ฉ (x)ทุกเดือน NSซึ่งแสดงด้วยตัวเลขระหว่าง 1 ถึง 12 เท่ากับจำนวนวันในเดือนนั้น ตารางค่าอาร์กิวเมนต์และฟังก์ชัน:

NS 1 2 3 4 5 6 7 8 9 10 11 12
ฉ (x) 31 28 31 30 31 30 31 31 30 31 30 31

หากคุณมีความปรารถนาที่จะลองด้วยตัวเองก่อนที่จะอ่านวิธีแก้ปัญหาของฉัน ตอนนี้ก็ถึงเวลาแล้ว หากคุณต้องการดูคำตอบสำเร็จรูปทันที ให้ดูที่สปอยเลอร์

ตอบ


ด้านล่างนี้คือขั้นตอนของฉันในการค้นหาวิธีแก้ไข

เครื่องมือทางคณิตศาสตร์

อันดับแรก เรามารีเฟรชหน่วยความจำของเราอย่างรวดเร็วเกี่ยวกับตัวดำเนินการที่สำคัญสองตัวในการแก้ปัญหานี้: การหารจำนวนเต็มและส่วนที่เหลือของการหาร

หารจำนวนเต็มเป็นโอเปอเรเตอร์ที่ใช้ในภาษาโปรแกรมหลายภาษาเมื่อทำการหารจำนวนเต็มสองจำนวนและละทิ้งส่วนที่เป็นเศษส่วนออกจากผลหาร ฉันจะพรรณนาเขาเป็น ตัวอย่างเช่น:

ส่วนที่เหลือของดิวิชั่นมันคือตัวดำเนินการที่หาส่วนที่เหลือของดิวิชั่น ภาษาโปรแกรมหลายภาษาใช้สัญลักษณ์ % แต่ฉันจะใช้โครงสร้างของแบบฟอร์ม เช่น

โปรดทราบว่าส่วนที่เหลือของแผนกมีลำดับความสำคัญเท่ากับส่วน

พื้นฐาน

ลองใช้เครื่องมือทางคณิตศาสตร์ของเราเพื่อให้ได้สูตรพื้นฐาน ในเดือนปกติมี 30 หรือ 31 วัน เราจึงสามารถใช้ 1 หรือ 0 เพื่อสลับกัน แล้วเพิ่มค่าคงที่ให้กับตัวเลขนี้:

เราได้ตารางค่าที่ถูกต้องจะถูกเน้นด้วยตัวหนา:
NS 1 2 3 4 5 6 7 8 9 10 11 12
ฉ (x) 31 30 31 30 31 30 31 30 31 30 31 30

เริ่มดี! มีค่าที่ถูกต้องอยู่แล้วสำหรับมกราคมและสำหรับเดือนมีนาคมถึงกรกฎาคมรวมอยู่ด้วย กุมภาพันธ์เป็นกรณีพิเศษ และเราจะจัดการกับมันในภายหลัง หลังจากเดือนกรกฎาคม สำหรับเดือนที่เหลือ ลำดับของการรับ 0 และ 1 จะต้องถูกกลับรายการ
ในการทำเช่นนี้ เราสามารถบวก 1 เข้ากับเงินปันผลได้:

NS 1 2 3 4 5 6 7 8 9 10 11 12
ฉ (x) 30 31 30 31 30 31 30 31 30 31 30 31

ตอนนี้ค่าที่ถูกต้องคือตั้งแต่เดือนสิงหาคมถึงธันวาคม แต่ตามที่คาดไว้ ค่าสำหรับเดือนอื่นๆ ไม่ถูกต้อง เรามาดูกันว่าเราจะรวมสูตรเหล่านี้ได้อย่างไร

มาส์กโอเวอร์เลย์

สิ่งนี้ต้องใช้ฟังก์ชันที่กำหนดเป็นชิ้นๆ แต่ - เนื่องจากมันดูน่าเบื่อสำหรับฉัน - ฉันคิดถึงวิธีแก้ปัญหาอื่น โดยใช้ส่วนหนึ่งของฟังก์ชันในช่วงเวลาหนึ่ง กับอีกช่วงหนึ่ง
ฉันคิดว่ามันง่ายที่สุดในการค้นหานิพจน์ที่เท่ากับ 1 ในแอปพลิเคชันเดียวและ 0 ในแอปพลิเคชันที่เหลือ วิธีการที่เราแยกอาร์กิวเมนต์ด้วยนิพจน์ในการคูณอาร์กิวเมนต์นั้นออกจากสูตรที่อยู่นอกขอบเขตของแอปพลิเคชัน ฉันเรียกว่า "การกำบัง" เพราะพฤติกรรมนี้คล้ายกับบิตมาสก์บางประเภท
หากต้องการใช้วิธีนี้ในส่วนสุดท้ายของฟังก์ชัน คุณต้องค้นหานิพจน์ที่เท่ากับ 1 สำหรับ และ - เนื่องจากค่าอาร์กิวเมนต์จะน้อยกว่า 16 เสมอ การหารจำนวนเต็มด้วย 8 จึงใช้ได้
NS 1 2 3 4 5 6 7 8 9 10 11 12
NS ⁄ 8 ⌋ 0 0 0 0 0 0 0 1 1 1 1 1

ทีนี้ โดยใช้มาสก์นี้ โดยใช้นิพจน์แทน 1 ในการปันผล เราสามารถแทนที่ลำดับของการได้ 0 และ 1 ของสูตรด้วยค่าที่ตรงกันข้าม:

NS 1 2 3 4 5 6 7 8 9 10 11 12
ฉ (x) 31 30 31 30 31 30 31 31 30 31 30 31

ยูเรก้า! ทุกอย่างถูกต้อง ยกเว้นเดือนกุมภาพันธ์ เซอร์ไพรส์.

กุมภาพันธ์

เดือนใดๆ มี 30 หรือ 31 วัน ยกเว้นเดือนกุมภาพันธ์กับวันที่ 28 (ปีอธิกสุรทินอยู่นอกเหนือขอบเขตของปัญหานี้) ในขณะนี้ ตามสูตรของเรา มันมี 30 วัน ดังนั้น คงจะดีถ้าลบนิพจน์เท่ากับ 2 at
สิ่งที่ดีที่สุดที่ฉันสามารถทำได้คือสิ่งนี้ซึ่งสวมหน้ากากทุกเดือนหลังจากเดือนกุมภาพันธ์:
NS 1 2 3 4 5 6 7 8 9 10 11 12
2 mod NS 0 0 2 2 2 2 2 2 2 2 2 2

เปลี่ยนค่าคงที่ฐานเป็น 28 บวก 2 ในเดือนที่เหลือ เราได้สูตร:

NS 1 2 3 4 5 6 7 8 9 10 11 12
ฉ (x) 29 28 31 30 31 30 31 31 30 31 30 31

ขออภัย ขณะนี้เดือนมกราคมสั้นลง 2 วัน โชคดีที่มันง่ายที่จะได้รับนิพจน์ที่ใช้กับเดือนแรกเท่านั้น นั่นคือค่าผกผันของตัวเลขที่ปัดเศษลง คูณด้วย 2 เราจะได้สูตรสุดท้าย:

NS 1 2 3 4 5 6 7 8 9 10 11 12
ฉ (x) 31 28 31 30 31 30 31 31 30 31 30 31

Afterword

นี่คือ - สูตรการหาจำนวนวันในเดือนใดๆ ของปี โดยใช้เลขคณิตที่ง่ายที่สุด ครั้งต่อไปที่คุณนึกถึงจำนวนวันในเดือนกันยายน ให้ทำเช่นนี้ด้วยฟังก์ชัน JavaScript แบบบรรทัดเดียว:

ฟังก์ชัน f (x) (ส่งคืน 28 + (x + Math.floor (x / 8))% 2 + 2% x + 2 * Math.floor (1 / x);)

ส่วนที่II

บทนำ

ในส่วนแรกได้สูตรที่สั้นและสง่างามเล็กน้อย ข้อดีหลักคือความเรียบง่ายของอุปกรณ์ทางคณิตศาสตร์ การไม่มีกิ่งก้านและนิพจน์เงื่อนไข และความกะทัดรัด ข้อเสีย - นอกเหนือจากความจริงที่ว่าคุณจะไม่ใช้ในโครงการของคุณ - รวมถึงการขาดการตรวจสอบสำหรับ viscoconut และปีที่ไม่ใช่ปีอธิกสุรทิน
ดังนั้นฉันจึงกำหนดภารกิจในการสร้างฟังก์ชัน NSเพื่อให้ค่า ฉ (x, y)ทุกเดือน NSแทนด้วยตัวเลขตั้งแต่ 1 ถึง 12 และหนึ่งปี yมากกว่า 0 เท่ากับจำนวนวันในหนึ่งเดือน NSในปีนี้ y.
สำหรับคนใจร้อนมีคำตอบใต้สปอยนะครับ ส่วนคนที่เหลือขอให้ติดตามครับ

ตอบ

ส่วนที่เหลือของแผนก: modและ ⌊⌋

เพื่อความชัดเจนของภาพ ให้ตกลงกันว่าในบางสูตร ตัวดำเนินการหารด้วยเศษเหลือจะถูกแทนที่ด้วยวงเล็บล่าง ซึ่งดูเหมือนว่าจำเป็นสำหรับฉัน:

ปีอธิกสุรทิน

ในปีอธิกสุรทิน จะมีวันเพิ่มตามปฏิทิน: 29 ​​กุมภาพันธ์ อย่างที่คุณทราบ ปีอธิกสุรทินคือผลคูณของ 4 และไม่ใช่ผลคูณของ 100 หรือผลคูณของ 400 มาเขียนนิพจน์ที่เหมือนกับข้อความนี้กัน:

ในการแปลงนิพจน์นี้เป็นนิพจน์เกี่ยวกับพีชคณิต จำเป็นต้องใช้การฉีดแบบฟอร์มกับผลลัพธ์ของนิพจน์:

ซึ่งจะทำให้คุณได้ 1 เมื่อหารไม่มีเศษและ 0 เมื่อหารด้วยเศษเหลือเพื่อใช้ในสูตรการกำหนดจำนวนวันในหนึ่งเดือน

เป็นหน้าที่ NS "คุณสามารถใช้ 1 ลบเศษเหลือสำหรับ:

NS 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
กรัม "(x) อินฟินิตี้ 1 0 0 0 0 0 0 0 0 0 0 0 0 0

เป็นเรื่องง่ายที่จะเห็นว่าการเพิ่มเงินปันผลและตัวหารด้วย 1 ทำให้เราได้สูตรที่ถูกต้องสำหรับ:
NS 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
กรัม "(x) 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0

ดังนั้นเราจึงเขียนนิพจน์เป็น:


และเราเขียนนิพจน์เป็น:

เมื่อใช้วิธีนี้เราจะได้ฟังก์ชันดังต่อไปนี้ กรัม (y)ค่าที่จะเป็น 1 ถ้าปีเป็นปีอธิกสุรทิน หรือ 0 อย่างอื่น:

y 1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000
กรัม (y) 0 0 1 0 0 0 1 0 0 0 1
y 2000 2100 2200 2300 2400 2500 2600 2700 2800 2900 3000
กรัม (y) 1 0 0 0 1 0 0 0 1 0 0

ปีอธิกสุรทินเป็นตัวหนา

ฉันขอเตือนคุณว่าภายในกรอบของข้อตกลงที่ยอมรับ ผู้ดำเนินการรับส่วนที่เหลือของแผนกสามารถแสดงเป็น modและ ⌊⌋.

มาส์กโอเวอร์เลย์

ในสูตรส่วนที่เป็นการแก้ไขเพิ่ม 2 วันในเดือนมกราคม หากเราลบตัวประกอบของ 2 และแทนที่ 1 ด้วย 2 ในตัวเศษ สูตรนี้จะเพิ่ม 2 วันในเดือนมกราคม และ 1 วันเป็นเดือนกุมภาพันธ์ ซึ่งจะทำให้เราเพิ่มวันในปีอธิกสุรทินได้ เพื่อความชัดเจน เราใช้ค่ากลางในสูตร กรัม (y)และเช่น yเราใช้ปี 2000 (อธิกสุรทิน) และปี 2544 (ไม่ใช่ปีอธิกสุรทิน):

NS 1 2 3 4 5 6 7 8 9 10 11 12
ฉ (x, 2000) 31 29 31 30 31 30 31 31 30 31 30 31
ฉ (x, 2001) 30 28 31 30 31 30 31 31 30 31 30 30

ค่าของทุกเดือนยกเว้นเดือนมกราคมของปีที่ไม่ใช่ปีอธิกสุรทินนั้นถูกต้อง

เพื่อแก้ไขความเข้าใจผิดที่น่ารำคาญนี้ ให้เพิ่ม 1 วันถึงเดือนมกราคมด้วยสูตรที่เรารู้อยู่แล้ว:


หรือ:

NS 1 2 3 4 5 6 7 8 9 10 11 12
ฉ (x, 2000) 31 29 31 30 31 30 31 31 30 31 30 31
ฉ (x, 2001) 31 28 31 30 31 30 31 31 30 31 30 30

บทสรุป

เป็นผลให้ยุ่งยากมากขึ้น แต่ได้สูตรสากลมากขึ้นซึ่งสามารถใช้เพื่อรับจำนวนวันในเดือนของปีหนึ่ง:

ฟังก์ชัน f (x, y) (ส่งคืน 28 + ((x + Math.floor (x / 8))% 2) + 2% x + Math.floor ((1 + (1 - (y% 4 + 2)% (y% 4 + 1)) * ((y% 100 + 2)% (y% 100 + 1)) + (1 - (y% 400 + 2)% (y% 400 + 1))) / x) + Math.floor (1 / x) - Math.floor (((1 - (y% 4 + 2)% (y% 4 + 1)) * ((y% 100 + 2)% (y% 100 + 1 )) + (1 - (y% 400 + 2)% (y% 400 + 1))) / x);)
ตัวอย่างในภาษา C # ideone.com/fANutz

1 ... ฉันไม่รู้วิธีใช้ตัวช่วยจำ ดังนั้นฉันจึงแอบดูป้ายบนอินเทอร์เน็ต
2 ... "พื้นฐาน" หรือ "กฎที่มีข้อยกเว้นมากมาย" เช่นเดียวกับกฎส่วนใหญ่
3 ... ในขั้นต้น กุมภาพันธ์เป็นเดือนสุดท้ายของปีในปฏิทินโรมัน ดังนั้นจึงมีเหตุผลที่สั้นกว่าเดือนอื่นๆ นอกจากนี้ยังมีตรรกะในการเพิ่มหรือลบวันเมื่อสิ้นปี ดังนั้นความยาวจึงแปรผันได้

อัปเดต 1:
การแปลอื่นของส่วนแรกใน

ในการแก้ปัญหาบางอย่างเมื่อสร้างตาราง คุณต้องระบุจำนวนวันในหนึ่งเดือนในเซลล์ที่แยกจากกันหรือภายในสูตร เพื่อให้โปรแกรมสามารถดำเนินการคำนวณที่จำเป็นได้ Excel มีเครื่องมือสำหรับดำเนินการนี้ มาพิจารณากัน วิธีทางที่แตกต่างการประยุกต์ใช้โอกาสนี้

คุณสามารถคำนวณจำนวนวันในหนึ่งเดือนใน Excel โดยใช้ตัวดำเนินการหมวดหมู่พิเศษ "วันและเวลา"... หากต้องการทราบว่าตัวเลือกใดเหมาะสมที่สุด คุณต้องกำหนดเป้าหมายของการดำเนินการก่อน ทั้งนี้ขึ้นอยู่กับสิ่งนี้ ผลลัพธ์ของการคำนวณสามารถแสดงเป็นองค์ประกอบแยกต่างหากบนแผ่นงาน หรือสามารถใช้ในสูตรอื่นได้

วิธีที่ 1: การรวมกันของตัวดำเนินการ DAY และ EONMONTH

ที่สุด ด้วยวิธีง่ายๆเพื่อแก้ปัญหานี้คือการรวมกันของตัวดำเนินการ วันและ แห่งยุค.

การทำงาน วันอยู่ในกลุ่มโอเปอเรเตอร์ "วันและเวลา"... เธอชี้ไปที่หมายเลขเฉพาะจาก 1 ก่อน 31 ... ในกรณีของเรา งานของโอเปอเรเตอร์นี้คือการบ่งชี้ วันสุดท้ายเดือนโดยใช้ฟังก์ชันในตัวเป็นอาร์กิวเมนต์ แห่งยุค.

ไวยากรณ์ตัวดำเนินการ วันต่อไป:

วัน (date_num_format)

นั่นคืออาร์กิวเมนต์เดียวของฟังก์ชันนี้คือ "วันที่ในรูปแบบตัวเลข"... จะถูกตั้งค่าโดยโอเปอเรเตอร์ แห่งยุค... ต้องบอกว่าวันที่ในรูปแบบตัวเลขแตกต่างจากรูปแบบปกติ ตัวอย่างเช่นวันที่ 04.05.2017 ตัวเลขจะมีลักษณะเช่น 42859 ... ดังนั้น Excel จึงใช้รูปแบบนี้สำหรับการดำเนินการภายในเท่านั้น ไม่ค่อยได้ใช้เพื่อแสดงในเซลล์

โอเปอเรเตอร์ แห่งยุคมีวัตถุประสงค์เพื่อระบุเลขลำดับของวันสุดท้ายของเดือน ซึ่งเป็นจำนวนเดือนที่ระบุไปข้างหน้าหรือย้อนกลับจากวันที่ระบุ ไวยากรณ์ของฟังก์ชันมีดังนี้:

EON MONTHS (วันที่เริ่มต้น num_months)

โอเปอเรเตอร์ "วันที่เริ่มต้น"มีวันที่ที่ทำการนับถอยหลังหรือการอ้างอิงไปยังเซลล์ที่มันตั้งอยู่

โอเปอเรเตอร์ "จำนวนเดือน"ระบุจำนวนเดือนที่จะนับจากวันที่ที่กำหนด

ตอนนี้เรามาดูกันว่ามันทำงานอย่างไรกับตัวอย่างเฉพาะ เมื่อต้องการทำสิ่งนี้ ให้นำแผ่นงาน Excel มาใส่ในเซลล์หนึ่งที่มีการจารึกหมายเลขปฏิทินไว้ จำเป็นต้องใช้โอเปอเรเตอร์ชุดด้านบนเพื่อกำหนดจำนวนวันในรอบเดือนที่ตัวเลขนี้อ้างอิง


สูตรทั่วไปของเรามีรูปแบบดังต่อไปนี้:

วัน (EONTHS (B3,0))

ในสูตรนี้ ค่าตัวแปรเป็นเพียงที่อยู่ของเซลล์ ( B3). ดังนั้นหากคุณไม่ต้องการดำเนินการตามขั้นตอนด้วย ตัวช่วยสร้างฟังก์ชันคุณสามารถแทรกสูตรนี้ลงในองค์ประกอบใดๆ ของแผ่นงานได้โดยเพียงแค่แทนที่ที่อยู่ของเซลล์ที่มีตัวเลขด้วยที่อยู่ที่เกี่ยวข้องในกรณีเฉพาะของคุณ ผลลัพธ์จะคล้ายกัน

วิธีที่ 2: การกำหนดจำนวนวันโดยอัตโนมัติ

ทีนี้มาดูปัญหาอื่นกัน จำเป็นต้องแสดงจำนวนวันไม่ใช่ตามวันที่ในปฏิทินที่กำหนด แต่แสดงตามวันที่ปัจจุบัน นอกจากนี้ การเปลี่ยนแปลงของช่วงเวลาจะทำโดยอัตโนมัติโดยที่ผู้ใช้ไม่ต้องดำเนินการใดๆ แม้ว่าจะดูแปลก แต่งานนี้ง่ายกว่าก่อนหน้านี้ แก้ได้แม้เปิด ตัวช่วยสร้างฟังก์ชันไม่จำเป็นเพราะสูตรที่ดำเนินการนี้ไม่มีค่าตัวแปรหรือการอ้างอิงเซลล์ คุณสามารถใส่สูตรต่อไปนี้ลงในเซลล์ของแผ่นงานที่คุณต้องการให้แสดงผลลัพธ์โดยไม่มีการเปลี่ยนแปลง:

วัน (E-MONTHS (วันนี้ (); 0))

ฟังก์ชัน TODAY ในตัวที่เราใช้ในกรณีนี้จะแสดงตัวเลขของวันนี้และไม่มีอาร์กิวเมนต์ ดังนั้น เซลล์ของคุณจะแสดงจำนวนวันในเดือนปัจจุบันอย่างต่อเนื่อง

วิธีที่ 3: คำนวณจำนวนวันที่จะใช้ในสูตรที่ซับซ้อน

ในตัวอย่างข้างต้น เราได้แสดงวิธีการคำนวณจำนวนวันในหนึ่งเดือนสำหรับวันที่ในปฏิทินที่ระบุ หรือโดยอัตโนมัติสำหรับเดือนปัจจุบันด้วยผลลัพธ์ในเซลล์ที่แยกจากกัน แต่อาจจำเป็นต้องหาค่านี้เพื่อคำนวณอินดิเคเตอร์อื่นๆ ในกรณีนี้ การคำนวณจำนวนวันจะดำเนินการในสูตรที่ซับซ้อนและจะไม่แสดงในเซลล์ที่แยกจากกัน ลองดูวิธีการทำกับตัวอย่าง

เราต้องทำให้เซลล์แสดงจำนวนวันที่เหลือจนถึงสิ้นเดือนปัจจุบัน เช่นเดียวกับวิธีก่อนหน้า ตัวเลือกนี้ไม่จำเป็นต้องเปิด ตัวช่วยสร้างฟังก์ชัน... คุณเพียงแค่พิมพ์นิพจน์ต่อไปนี้ลงในเซลล์:

DAY (E-MONTHS (วันนี้ (); 0)) - DAY (วันนี้ ())

หลังจากนั้น จำนวนวันจนถึงสิ้นเดือนจะแสดงในเซลล์ที่ระบุ ทุกวัน ผลลัพธ์จะอัปเดตโดยอัตโนมัติ และตั้งแต่เริ่มต้นช่วงเวลาใหม่ การนับถอยหลังจะเริ่มขึ้นใหม่ มันกลับกลายเป็นตัวจับเวลาถอยหลังชนิดหนึ่ง

อย่างที่คุณเห็น สูตรนี้ประกอบด้วยสองส่วน อย่างแรกคือนิพจน์ที่คุ้นเคยสำหรับการคำนวณจำนวนวันในหนึ่งเดือน:

วัน (E-MONTHS (วันนี้ (); 0))

แต่ในส่วนที่สอง ตัวเลขของวันนี้ถูกลบออกจากตัวบ่งชี้นี้:

วันต่อวัน ())

ดังนั้น เมื่อทำการคำนวณนี้ สูตรสำหรับคำนวณจำนวนวันจึงเป็นส่วนหนึ่งของสูตรที่ซับซ้อนมากขึ้น

วิธีที่ 4: สูตรทางเลือก

แต่น่าเสียดายที่เวอร์ชันของโปรแกรมที่เก่ากว่า Excel 2007 ไม่มีโอเปอเรเตอร์ แห่งยุค... แล้วผู้ใช้ที่ใช้แอปพลิเคชั่นเวอร์ชันเก่าล่ะ? สำหรับพวกเขา โอกาสนี้เกิดขึ้นได้จากอีกสูตรหนึ่ง ซึ่งมากกว่าสูตรที่อธิบายข้างต้น มาดูวิธีการคำนวณจำนวนวันในหนึ่งเดือนสำหรับวันที่ในปฏิทินที่ระบุโดยใช้ตัวเลือกนี้

  1. เลือกเซลล์สำหรับแสดงผลและไปที่หน้าต่างอาร์กิวเมนต์ตัวดำเนินการ วันในแบบที่เราคุ้นเคยอยู่แล้ว วางเคอร์เซอร์ในช่องเดียวของหน้าต่างนี้ และคลิกที่สามเหลี่ยมคว่ำทางด้านซ้ายของแถบสูตร ไปที่ส่วน "หน้าที่อื่น ๆ ... ".
  2. ในหน้าต่าง ตัวช่วยสร้างฟังก์ชันในกลุ่ม "วันและเวลา"เน้นชื่อ "วันที่"และคลิกที่ปุ่ม "ตกลง".
  3. หน้าต่างตัวดำเนินการเริ่มต้นขึ้น วันที่. ฟังก์ชั่นนี้แปลงวันที่จากรูปแบบปกติเป็นค่าตัวเลข ซึ่งผู้ดำเนินการจะต้องดำเนินการ วัน.

    หน้าต่างที่เปิดขึ้นมีสามช่อง ในสนาม "วัน"คุณสามารถป้อนหมายเลขได้ทันที "1"... การดำเนินการนี้จะเหมือนกันในทุกสถานการณ์ แต่อีกสองฟิลด์จะต้องได้รับการจัดการอย่างถี่ถ้วน

    วางเคอร์เซอร์ในฟิลด์ "ปี"... ต่อไปเราจะเลือกตัวดำเนินการผ่านรูปสามเหลี่ยมที่คุ้นเคย

  4. ทั้งหมดในหมวดเดียวกัน ตัวช่วยสร้างฟังก์ชันเน้นชื่อ "ปี"และคลิกที่ปุ่ม "ตกลง".
  5. หน้าต่างอาร์กิวเมนต์ตัวดำเนินการเริ่มต้น ปี... กำหนดปีตามวันที่ระบุ ในกล่องหน้าต่างเดียว "วันที่ในรูปแบบตัวเลข"เราระบุลิงก์ไปยังเซลล์ที่มีวันที่เดิมที่คุณต้องการกำหนดจำนวนวัน หลังจากนั้นอย่ารีบคลิกที่ปุ่ม "ตกลง"และคลิกที่ชื่อ "วันที่"บนแถบสูตร
  6. จากนั้นเรากลับไปที่หน้าต่างอาร์กิวเมนต์อีกครั้ง วันที่... วางเคอร์เซอร์ในช่อง "เดือน"และไปเลือกฟังค์ชั่นต่างๆ
  7. วี ตัวช่วยสร้างฟังก์ชันคลิกที่ชื่อ "เดือน"และคลิกที่ปุ่ม "ตกลง".
  8. หน้าต่างอาร์กิวเมนต์ของฟังก์ชันเริ่มทำงาน เดือน... งานคล้ายกับตัวดำเนินการก่อนหน้าเพียงแสดงค่าของหมายเลขเดือน ในช่องเดียวของหน้าต่างนี้ ให้ตั้งค่าการอ้างอิงเดียวกันกับหมายเลขเดิม จากนั้นในแถบสูตร ให้คลิกที่ชื่อ "วัน".
  9. กลับไปที่หน้าต่างอาร์กิวเมนต์ วัน... ที่นี่เราต้องทำจังหวะเล็ก ๆ เพียงครั้งเดียว ในช่องเดียวของหน้าต่างซึ่งมีข้อมูลอยู่แล้ว ให้เพิ่มนิพจน์ต่อท้ายสูตร "-1"โดยไม่ต้องใส่เครื่องหมายอัญประกาศ และใส่ "+1" หลังโอเปอเรเตอร์ด้วย เดือน... หลังจากนั้นคลิกที่ปุ่ม "ตกลง".
  10. ดังที่คุณเห็น เซลล์ที่เลือกไว้ล่วงหน้าจะแสดงจำนวนวันในเดือนที่มีหมายเลขที่ระบุ สูตรทั่วไปมีลักษณะดังนี้:

    วัน (DATE (YEAR (D3); MONTH (D3) +1; 1) -1)

ความลับของสูตรนี้ง่ายมาก เราใช้เพื่อกำหนดวันที่ของวันแรกของรอบระยะเวลาถัดไป จากนั้นลบหนึ่งวันจากนั้นหาจำนวนวันในเดือนที่ระบุ ตัวแปรในสูตรนี้คือการอ้างอิงเซลล์ D3ในสองแห่ง หากคุณแทนที่ด้วยที่อยู่ของเซลล์ที่มีวันที่ในกรณีของคุณโดยเฉพาะ คุณสามารถขับนิพจน์นี้ไปยังองค์ประกอบใดก็ได้ในชีตโดยไม่ต้องใช้ความช่วยเหลือ ตัวช่วยสร้างฟังก์ชัน.

อย่างที่คุณเห็น มีหลายตัวเลือกในการค้นหาจำนวนวันในหนึ่งเดือนใน Excel อันไหนที่จะใช้ขึ้นอยู่กับเป้าหมายปลายทางของผู้ใช้ตลอดจนรุ่นของโปรแกรมที่เขาใช้

บันทึก: โพสต์นี้เป็นคำแปลของบทความ cmcenroe.me/2014/12/05/days-in-month-formula.html ( ส่วนที่ 1) เช่นเดียวกับการเพิ่มของผู้เขียน ( ส่วนที่II). คุณไม่ควรจริงจังกับเนื้อหานี้ แต่เป็นการวอร์มอัพสำหรับจิตใจ ไม่ต้องการอะไรมากไปกว่าความรู้ทางคณิตศาสตร์ของโรงเรียนและไม่มีการนำไปใช้จริง มีความสุขในการอ่านทุกคน!

ส่วนที่ 1

บทนำ

เมื่อเร็ว ๆ นี้หลังจากนอนไม่หลับอีกคืนหนึ่ง ฉันกำลังคิดเกี่ยวกับวิธีการจำจำนวนวันในแต่ละเดือนของปี สำหรับสิ่งนี้มีเครื่องนับเช่นเดียวกับวิธีการนับบนสนับมือ แต่ก็ไม่มีใครเหมาะกับฉัน ฉันสงสัยว่ามีสูตรทางคณิตศาสตร์บางประเภทสำหรับการแก้ปัญหาดังกล่าวหรือไม่ และ - ไม่พบสูตรที่มีการศึกษาคร่าวๆ - ฉันท้าทายตัวเองให้สร้างมันขึ้นมา

การจัดรูปแบบ กล่าวอีกนัยหนึ่ง จำเป็นต้องค้นหาฟังก์ชัน NSเพื่อให้ค่า ฉ (x)ทุกเดือน NSซึ่งแสดงด้วยตัวเลขระหว่าง 1 ถึง 12 เท่ากับจำนวนวันในเดือนนั้น ตารางค่าอาร์กิวเมนต์และฟังก์ชัน:

NS 1 2 3 4 5 6 7 8 9 10 11 12
ฉ (x) 31 28 31 30 31 30 31 31 30 31 30 31

หากคุณมีความปรารถนาที่จะลองด้วยตัวเองก่อนที่จะอ่านวิธีแก้ปัญหาของฉัน ตอนนี้ก็ถึงเวลาแล้ว หากคุณต้องการดูคำตอบสำเร็จรูปทันที ให้ดูที่สปอยเลอร์

ตอบ


ด้านล่างนี้คือขั้นตอนของฉันในการค้นหาวิธีแก้ไข

เครื่องมือทางคณิตศาสตร์

อันดับแรก เรามารีเฟรชหน่วยความจำของเราอย่างรวดเร็วเกี่ยวกับตัวดำเนินการที่สำคัญสองตัวในการแก้ปัญหานี้: การหารจำนวนเต็มและส่วนที่เหลือของการหาร

หารจำนวนเต็มเป็นโอเปอเรเตอร์ที่ใช้ในภาษาโปรแกรมหลายภาษาเมื่อทำการหารจำนวนเต็มสองจำนวนและละทิ้งส่วนที่เป็นเศษส่วนออกจากผลหาร ฉันจะพรรณนาเขาเป็น ตัวอย่างเช่น:

ส่วนที่เหลือของดิวิชั่นมันคือตัวดำเนินการที่หาส่วนที่เหลือของดิวิชั่น ภาษาโปรแกรมหลายภาษาใช้สัญลักษณ์ % แต่ฉันจะใช้โครงสร้างของแบบฟอร์ม เช่น

โปรดทราบว่าส่วนที่เหลือของแผนกมีลำดับความสำคัญเท่ากับส่วน

พื้นฐาน

ลองใช้เครื่องมือทางคณิตศาสตร์ของเราเพื่อให้ได้สูตรพื้นฐาน ในเดือนปกติมี 30 หรือ 31 วัน เราจึงสามารถใช้ 1 หรือ 0 เพื่อสลับกัน แล้วเพิ่มค่าคงที่ให้กับตัวเลขนี้:

เราได้ตารางค่าที่ถูกต้องจะถูกเน้นด้วยตัวหนา:
NS 1 2 3 4 5 6 7 8 9 10 11 12
ฉ (x) 31 30 31 30 31 30 31 30 31 30 31 30

เริ่มดี! มีค่าที่ถูกต้องอยู่แล้วสำหรับมกราคมและสำหรับเดือนมีนาคมถึงกรกฎาคมรวมอยู่ด้วย กุมภาพันธ์เป็นกรณีพิเศษ และเราจะจัดการกับมันในภายหลัง หลังจากเดือนกรกฎาคม สำหรับเดือนที่เหลือ ลำดับของการรับ 0 และ 1 จะต้องถูกกลับรายการ
ในการทำเช่นนี้ เราสามารถบวก 1 เข้ากับเงินปันผลได้:

NS 1 2 3 4 5 6 7 8 9 10 11 12
ฉ (x) 30 31 30 31 30 31 30 31 30 31 30 31

ตอนนี้ค่าที่ถูกต้องคือตั้งแต่เดือนสิงหาคมถึงธันวาคม แต่ตามที่คาดไว้ ค่าสำหรับเดือนอื่นๆ ไม่ถูกต้อง เรามาดูกันว่าเราจะรวมสูตรเหล่านี้ได้อย่างไร

มาส์กโอเวอร์เลย์

สิ่งนี้ต้องใช้ฟังก์ชันที่กำหนดเป็นชิ้นๆ แต่ - เนื่องจากมันดูน่าเบื่อสำหรับฉัน - ฉันคิดถึงวิธีแก้ปัญหาอื่น โดยใช้ส่วนหนึ่งของฟังก์ชันในช่วงเวลาหนึ่ง กับอีกช่วงหนึ่ง
ฉันคิดว่ามันง่ายที่สุดในการค้นหานิพจน์ที่เท่ากับ 1 ในแอปพลิเคชันเดียวและ 0 ในแอปพลิเคชันที่เหลือ วิธีการที่เราแยกอาร์กิวเมนต์ด้วยนิพจน์ในการคูณอาร์กิวเมนต์นั้นออกจากสูตรที่อยู่นอกขอบเขตของแอปพลิเคชัน ฉันเรียกว่า "การกำบัง" เพราะพฤติกรรมนี้คล้ายกับบิตมาสก์บางประเภท
หากต้องการใช้วิธีนี้ในส่วนสุดท้ายของฟังก์ชัน คุณต้องค้นหานิพจน์ที่เท่ากับ 1 สำหรับ และ - เนื่องจากค่าอาร์กิวเมนต์จะน้อยกว่า 16 เสมอ การหารจำนวนเต็มด้วย 8 จึงใช้ได้
NS 1 2 3 4 5 6 7 8 9 10 11 12
NS ⁄ 8 ⌋ 0 0 0 0 0 0 0 1 1 1 1 1

ทีนี้ โดยใช้มาสก์นี้ โดยใช้นิพจน์แทน 1 ในการปันผล เราสามารถแทนที่ลำดับของการได้ 0 และ 1 ของสูตรด้วยค่าที่ตรงกันข้าม:

NS 1 2 3 4 5 6 7 8 9 10 11 12
ฉ (x) 31 30 31 30 31 30 31 31 30 31 30 31

ยูเรก้า! ทุกอย่างถูกต้อง ยกเว้นเดือนกุมภาพันธ์ เซอร์ไพรส์.

กุมภาพันธ์

เดือนใดๆ มี 30 หรือ 31 วัน ยกเว้นเดือนกุมภาพันธ์กับวันที่ 28 (ปีอธิกสุรทินอยู่นอกเหนือขอบเขตของปัญหานี้) ในขณะนี้ ตามสูตรของเรา มันมี 30 วัน ดังนั้น คงจะดีถ้าลบนิพจน์เท่ากับ 2 at
สิ่งที่ดีที่สุดที่ฉันสามารถทำได้คือสิ่งนี้ซึ่งสวมหน้ากากทุกเดือนหลังจากเดือนกุมภาพันธ์:
NS 1 2 3 4 5 6 7 8 9 10 11 12
2 mod NS 0 0 2 2 2 2 2 2 2 2 2 2

เปลี่ยนค่าคงที่ฐานเป็น 28 บวก 2 ในเดือนที่เหลือ เราได้สูตร:

NS 1 2 3 4 5 6 7 8 9 10 11 12
ฉ (x) 29 28 31 30 31 30 31 31 30 31 30 31

ขออภัย ขณะนี้เดือนมกราคมสั้นลง 2 วัน โชคดีที่มันง่ายที่จะได้รับนิพจน์ที่ใช้กับเดือนแรกเท่านั้น นั่นคือค่าผกผันของตัวเลขที่ปัดเศษลง คูณด้วย 2 เราจะได้สูตรสุดท้าย:

NS 1 2 3 4 5 6 7 8 9 10 11 12
ฉ (x) 31 28 31 30 31 30 31 31 30 31 30 31

Afterword

นี่คือ - สูตรการหาจำนวนวันในเดือนใดๆ ของปี โดยใช้เลขคณิตที่ง่ายที่สุด ครั้งต่อไปที่คุณนึกถึงจำนวนวันในเดือนกันยายน ให้ทำเช่นนี้ด้วยฟังก์ชัน JavaScript แบบบรรทัดเดียว:

ฟังก์ชัน f (x) (ส่งคืน 28 + (x + Math.floor (x / 8))% 2 + 2% x + 2 * Math.floor (1 / x);)

ส่วนที่II

บทนำ

ในส่วนแรกได้สูตรที่สั้นและสง่างามเล็กน้อย ข้อดีหลักคือความเรียบง่ายของอุปกรณ์ทางคณิตศาสตร์ การไม่มีกิ่งก้านและนิพจน์เงื่อนไข และความกะทัดรัด ข้อเสีย - นอกเหนือจากความจริงที่ว่าคุณจะไม่ใช้ในโครงการของคุณ - รวมถึงการขาดการตรวจสอบสำหรับ viscoconut และปีที่ไม่ใช่ปีอธิกสุรทิน
ดังนั้นฉันจึงกำหนดภารกิจในการสร้างฟังก์ชัน NSเพื่อให้ค่า ฉ (x, y)ทุกเดือน NSแทนด้วยตัวเลขตั้งแต่ 1 ถึง 12 และหนึ่งปี yมากกว่า 0 เท่ากับจำนวนวันในหนึ่งเดือน NSในปีนี้ y.
สำหรับคนใจร้อนมีคำตอบใต้สปอยนะครับ ส่วนคนที่เหลือขอให้ติดตามครับ

ตอบ

ส่วนที่เหลือของแผนก: modและ ⌊⌋

เพื่อความชัดเจนของภาพ ให้ตกลงกันว่าในบางสูตร ตัวดำเนินการหารด้วยเศษเหลือจะถูกแทนที่ด้วยวงเล็บล่าง ซึ่งดูเหมือนว่าจำเป็นสำหรับฉัน:

ปีอธิกสุรทิน

ในปีอธิกสุรทิน จะมีวันเพิ่มตามปฏิทิน: 29 ​​กุมภาพันธ์ อย่างที่คุณทราบ ปีอธิกสุรทินคือผลคูณของ 4 และไม่ใช่ผลคูณของ 100 หรือผลคูณของ 400 มาเขียนนิพจน์ที่เหมือนกับข้อความนี้กัน:

ในการแปลงนิพจน์นี้เป็นนิพจน์เกี่ยวกับพีชคณิต จำเป็นต้องใช้การฉีดแบบฟอร์มกับผลลัพธ์ของนิพจน์:

ซึ่งจะทำให้คุณได้ 1 เมื่อหารไม่มีเศษและ 0 เมื่อหารด้วยเศษเหลือเพื่อใช้ในสูตรการกำหนดจำนวนวันในหนึ่งเดือน

เป็นหน้าที่ NS "คุณสามารถใช้ 1 ลบเศษเหลือสำหรับ:

NS 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
กรัม "(x) อินฟินิตี้ 1 0 0 0 0 0 0 0 0 0 0 0 0 0

เป็นเรื่องง่ายที่จะเห็นว่าการเพิ่มเงินปันผลและตัวหารด้วย 1 ทำให้เราได้สูตรที่ถูกต้องสำหรับ:
NS 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
กรัม "(x) 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0

ดังนั้นเราจึงเขียนนิพจน์เป็น:


และเราเขียนนิพจน์เป็น:

เมื่อใช้วิธีนี้เราจะได้ฟังก์ชันดังต่อไปนี้ กรัม (y)ค่าที่จะเป็น 1 ถ้าปีเป็นปีอธิกสุรทิน หรือ 0 อย่างอื่น:

y 1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000
กรัม (y) 0 0 1 0 0 0 1 0 0 0 1
y 2000 2100 2200 2300 2400 2500 2600 2700 2800 2900 3000
กรัม (y) 1 0 0 0 1 0 0 0 1 0 0

ปีอธิกสุรทินเป็นตัวหนา

ฉันขอเตือนคุณว่าภายในกรอบของข้อตกลงที่ยอมรับ ผู้ดำเนินการรับส่วนที่เหลือของแผนกสามารถแสดงเป็น modและ ⌊⌋.

มาส์กโอเวอร์เลย์

ในสูตรส่วนที่เป็นการแก้ไขเพิ่ม 2 วันในเดือนมกราคม หากเราลบตัวประกอบของ 2 และแทนที่ 1 ด้วย 2 ในตัวเศษ สูตรนี้จะเพิ่ม 2 วันในเดือนมกราคม และ 1 วันเป็นเดือนกุมภาพันธ์ ซึ่งจะทำให้เราเพิ่มวันในปีอธิกสุรทินได้ เพื่อความชัดเจน เราใช้ค่ากลางในสูตร กรัม (y)และเช่น yเราใช้ปี 2000 (อธิกสุรทิน) และปี 2544 (ไม่ใช่ปีอธิกสุรทิน):

NS 1 2 3 4 5 6 7 8 9 10 11 12
ฉ (x, 2000) 31 29 31 30 31 30 31 31 30 31 30 31
ฉ (x, 2001) 30 28 31 30 31 30 31 31 30 31 30 30

ค่าของทุกเดือนยกเว้นเดือนมกราคมของปีที่ไม่ใช่ปีอธิกสุรทินนั้นถูกต้อง

เพื่อแก้ไขความเข้าใจผิดที่น่ารำคาญนี้ ให้เพิ่ม 1 วันถึงเดือนมกราคมด้วยสูตรที่เรารู้อยู่แล้ว:


หรือ:

NS 1 2 3 4 5 6 7 8 9 10 11 12
ฉ (x, 2000) 31 29 31 30 31 30 31 31 30 31 30 31
ฉ (x, 2001) 31 28 31 30 31 30 31 31 30 31 30 30

บทสรุป

เป็นผลให้ยุ่งยากมากขึ้น แต่ได้สูตรสากลมากขึ้นซึ่งสามารถใช้เพื่อรับจำนวนวันในเดือนของปีหนึ่ง:

ฟังก์ชัน f (x, y) (ส่งคืน 28 + ((x + Math.floor (x / 8))% 2) + 2% x + Math.floor ((1 + (1 - (y% 4 + 2)% (y% 4 + 1)) * ((y% 100 + 2)% (y% 100 + 1)) + (1 - (y% 400 + 2)% (y% 400 + 1))) / x) + Math.floor (1 / x) - Math.floor (((1 - (y% 4 + 2)% (y% 4 + 1)) * ((y% 100 + 2)% (y% 100 + 1 )) + (1 - (y% 400 + 2)% (y% 400 + 1))) / x);)
ตัวอย่างในภาษา C # ideone.com/fANutz

1 ... ฉันไม่รู้วิธีใช้ตัวช่วยจำ ดังนั้นฉันจึงแอบดูป้ายบนอินเทอร์เน็ต
2 ... "พื้นฐาน" หรือ "กฎที่มีข้อยกเว้นมากมาย" เช่นเดียวกับกฎส่วนใหญ่
3 ... ในขั้นต้น กุมภาพันธ์เป็นเดือนสุดท้ายของปีในปฏิทินโรมัน ดังนั้นจึงมีเหตุผลที่สั้นกว่าเดือนอื่นๆ นอกจากนี้ยังมีตรรกะในการเพิ่มหรือลบวันเมื่อสิ้นปี ดังนั้นความยาวจึงแปรผันได้

อัปเดต 1:
การแปลอื่นของส่วนแรกใน

เครื่องคำนวณวันที่ออกแบบมาเพื่อคำนวณจำนวนวันระหว่างวันที่ และเพื่อค้นหาวันที่โดยการเพิ่มหรือลบจำนวนวันที่ระบุจากวันที่ที่ทราบ

เพิ่มวันถึงวันที่

หากต้องการทราบวันที่ในจำนวนวันที่กำหนด ให้ใช้ตัวเลือกนี้ ป้อนวันที่เริ่มต้นและจำนวนวันที่จะเพิ่มเข้าไป ใช้ค่าลบเพื่อลบ เครื่องคิดเลขยังมีตัวเลือกในการเพิ่มเฉพาะวันทำการ

การคำนวณจำนวนวันระหว่างวันที่

วิธีการคำนวณนี้จะตอบคำถามว่า "นับแต่วันที่ผ่านไปกี่วัน" ป้อนวันที่เริ่มต้นและวันที่สิ้นสุด แล้วคลิกปุ่ม "คำนวณ" เครื่องคิดเลขจะแสดงจำนวนวันที่ป้อนระหว่างวันที่ป้อน แยกจากกัน เครื่องคิดเลขจะแสดงจำนวนวันทำการ

ด้วยตัวเลือกนี้ คุณสามารถคำนวณจำนวนวันที่เหลือจนกว่าจะถึงเหตุการณ์หนึ่ง เช่น วันเกิดหรือวันหยุด เมื่อต้องการทำเช่นนี้ ให้ป้อนวันที่ของวันนี้ในฟิลด์วันที่เริ่มต้น และวันที่ของเหตุการณ์ในฟิลด์วันที่สิ้นสุด

วันหยุด

เครื่องคิดเลขสามารถคำนวณ บวก ลบ ได้ทั้งวันตามปฏิทินและวันทำการ วันหยุดนักขัตฤกษ์อย่างเป็นทางการคือ:

  • 1,2,3,4,5,6,8 มกราคม - วันหยุดปีใหม่
  • 7 มกราคม - คริสต์มาสออร์โธดอกซ์
  • 23 กุมภาพันธ์ - วันผู้พิทักษ์แห่งมาตุภูมิ
  • 8 มีนาคม - วันสตรีสากล
  • 1 พฤษภาคม - ฤดูใบไม้ผลิและวันแรงงาน
  • 9 พฤษภาคม - วันแห่งชัยชนะ
  • 12 มิถุนายน - วันแห่งรัสเซีย
  • 4 พฤศจิกายน - วันสามัคคีแห่งชาติ

หากวันหยุดนักขัตฤกษ์ตรงกับวันเสาร์หรือวันอาทิตย์ ให้เลื่อนไปเป็นวันทำการถัดไป แต่บางครั้งวันหยุดสุดสัปดาห์ก็ถูกย้ายไปที่อื่นในปฏิทิน ตัวอย่างเช่น วันเสาร์และวันอาทิตย์ซึ่งตรงกับวันหยุดปีใหม่ สามารถย้ายไปยังเดือนพฤษภาคมเพื่อขยายวันหยุดในเดือนพฤษภาคม

เมื่อคำนวณวัน เครื่องคิดเลขจะพิจารณาทั้งวันหยุดราชการและการโอนทั้งหมด