Saya memerlukan metode untuk menambahkan "hari kerja" di PHP. Misalnya, Jumat 12/5 + 3 hari kerja = Rabu 12/10.
Minimal saya memerlukan kode untuk memahami akhir pekan, tetapi idealnya kode itu juga harus memperhitungkan hari libur federal AS. Saya yakin saya bisa menemukan solusi dengan kekerasan jika perlu, tapi saya berharap ada pendekatan yang lebih elegan di luar sana. Siapa saja?
Terima kasih.
Jawaban:
Berikut adalah fungsi dari komentar pengguna pada halaman fungsi date () di manual PHP. Ini merupakan peningkatan dari fungsi sebelumnya di komentar yang menambahkan dukungan untuk tahun kabisat.
Masukkan tanggal mulai dan akhir, bersama dengan larik hari libur yang mungkin ada di antaranya, dan ini mengembalikan hari kerja sebagai bilangan bulat:
sumber
Dapatkan jumlah hari kerja tanpa hari libur antara dua tanggal:
Gunakan contoh:
Keluaran:
Fungsi:
sumber
$interval = DateInterval::createFromFormat('1 weekday');
saya juga merekomendasikan penggunaan$holidays = array_flip($holidays);
before theach danif isset($holidays[$period->format('Y-m-d')]);
untuk menurunkan jumlah waktu pemrosesan yang diperlukan per iterasi. Tetapi rekomendasikan untuk membuat fungsi khusus untuk hari libur agar dapat memproses hari libur relatif seperti syukurlast thursday of november
atau hari buruhfirst monday of september
Ada beberapa argumen untuk fungsi date () yang seharusnya membantu. Jika Anda memeriksa tanggal ("w") itu akan memberi Anda nomor untuk hari dalam seminggu, dari 0 untuk Minggu sampai 6 untuk Sabtu. Jadi .. mungkin sesuatu seperti ..
Ini hanyalah contoh kasar dari satu kemungkinan ..
sumber
Perhitungan hari libur tidak standar di setiap Negara Bagian. Saya sedang menulis aplikasi bank yang memerlukan beberapa aturan bisnis yang ketat tetapi masih bisa mendapatkan standar kasar.
sumber
sumber
Berikut adalah fungsi untuk menambahkan hari bisnis ke tanggal
Posting lain menyebutkan getWorkingDays (dari komentar php.net dan disertakan di sini) tetapi saya pikir itu rusak jika Anda mulai pada hari Minggu dan selesai pada hari kerja.
Menggunakan yang berikut (Anda harus menyertakan fungsi getWorkingDays dari posting sebelumnya)
Memberikan hasil sebagai 5 bukan 4
Fungsi berikut digunakan untuk menghasilkan di atas.
Bawa liburan ...
sumber
Anda dapat mencoba fungsi ini yang lebih sederhana.
sumber
Sebuah fungsi untuk menambah atau mengurangi hari kerja dari tanggal tertentu, ini tidak memperhitungkan hari libur.
gunakan seperti itu ...
sumber
Versi saya berdasarkan karya @mcgrailm ... di-tweak karena laporan perlu ditinjau dalam 3 hari kerja, dan jika diserahkan pada akhir pekan, penghitungan akan dimulai pada hari Senin berikutnya:
Dan mencari tahu perbedaan dua tanggal dalam hal hari kerja:
Sebagai catatan, setiap orang yang menggunakan 86400, atau 24 * 60 * 60, mohon jangan ... waktu lupa Anda berubah dari waktu musim dingin / musim panas, di mana sehari tidak tepat 24 jam. Meskipun sedikit lebih lambat pada strtotime ('+ 1 day', $ timestamp), ini jauh lebih dapat diandalkan.
sumber
Upaya kasar untuk mendeteksi waktu kerja - Senin hingga Jumat pukul 08.00-16.00:
sumber
Di bawah ini adalah kode kerja untuk menghitung hari kerja dari tanggal tertentu.
sumber
Berikut adalah solusi lain tanpa loop untuk setiap hari.
sumber
Untuk hari libur, buat larik hari dalam beberapa format yang dapat dihasilkan oleh tanggal (). Contoh:
Kemudian gunakan fungsi in_array () dan date () untuk memeriksa apakah stempel waktu mewakili hari libur:
sumber
Saya memiliki kebutuhan yang sama, saya mulai dengan contoh pertama bobbin dan berakhir dengan ini
hth seseorang
sumber
!in_array($enddate,$holidays)
ke!in_array(date('Y-m-d',$enddate),$holidays)
jika menggunakan array liburan yang diteruskan seperti Bobbins '-$holidays=array('2013-06-16','2013-07-12','2013-08-05');
Jika tidak, Anda memeriksa array penuh tanggal untuk cap waktu, yang selalu mengembalikan false.Varian 1:
Varian 2:
Varian 3:
Pertimbangan hari libur tambahan dapat dibuat dengan menggunakan variasi di atas dengan melakukan hal berikut. Catatan! pastikan semua stempel waktu adalah waktu yang sama pada hari itu (yaitu tengah malam).
Buatlah susunan tanggal hari libur (sebagai stempel waktu unix) yaitu:
Ubah baris:
menjadi :
Selesai!
sumber
sumber
Berikut adalah solusi rekursif. Ini dapat dengan mudah dimodifikasi untuk hanya melacak dan mengembalikan tanggal terbaru.
sumber
sumber
sumber
menghitung hari kerja antara dua tanggal termasuk hari libur dan minggu kerja khusus
Jawabannya tidak sepele - jadi saran saya adalah menggunakan kelas di mana Anda dapat mengkonfigurasi lebih dari sekedar mengandalkan fungsi sederhana (atau dengan asumsi lokal dan budaya tetap). Untuk mendapatkan tanggal setelah sejumlah hari kerja, Anda akan:
Pendekatan Fungsional
sumber
Ini adalah solusi lain, ini hampir 25% lebih cepat daripada memeriksa hari libur dengan in_array:
sumber
Cuplikan kode ini sangat mudah untuk menghitung hari kerja tanpa akhir pekan dan hari libur:
sumber
Saya tahu saya terlambat ke pesta, tetapi saya menggunakan rangkaian acara lama oleh Marcos J. Montes ini untuk mencari tahu hari libur dan hari kerja. Dia meluangkan waktu untuk menambahkan algoritme dari tahun 1876 untuk Paskah dan dia menambahkan semua hari libur utama AS. Ini dapat dengan mudah diperbarui untuk negara lain.
sumber
function get_business_days_forward_from_date ($ num_days, $ start_date = '', $ rtn_fmt = 'Ym-d') {
}
sumber
Add_business_days memiliki bug kecil. Coba yang berikut ini dengan fungsi yang ada dan hasilnya adalah hari Sabtu.
Tanggal mulai = Jumat Hari kerja untuk ditambahkan = 1 Hari libur array = Tambahkan tanggal untuk hari Senin berikutnya.
Saya telah memperbaikinya di fungsi saya di bawah ini.
sumber
Saya baru saja menjalankan fungsi saya berdasarkan kode Bobbin dan mcgrailm, menambahkan beberapa hal yang berfungsi sempurna untuk saya.
sumber
Peningkatan fungsi yang ditawarkan oleh James Pasta di atas, untuk menyertakan semua Hari Libur Federal, dan untuk mengoreksi tanggal 4 Juli (dihitung sebagai 4 Juni di atas!), Dan untuk juga menyertakan nama hari libur sebagai kunci larik ...
/ **
* Hari Libur Nasional Amerika
* @param string $ year
* @return array
* /
public static function getNationalAmericanHolidays ($ year) {
}
sumber
Baru saja selesai menulis API yang dapat digunakan untuk memanipulasi hari kerja (tidak ada solusi yang cukup berhasil untuk situasi saya :-); menautkannya di sini jika ada orang lain yang menganggapnya berguna.
~ Nate
Kelas PHP untuk Menghitung Hari Kerja
sumber
Terima kasih kepada Bobbin, mcgrailm, Tony, James Pasta, dan beberapa orang lainnya yang memposting di sini. Saya telah menulis fungsi saya sendiri untuk menambahkan hari kerja ke suatu tanggal, tetapi memodifikasinya dengan beberapa kode yang saya temukan di sini. Ini akan menangani tanggal mulai pada akhir pekan / hari libur. Ini juga akan menangani jam kerja. Saya menambahkan beberapa komentar dan memecah kode agar lebih mudah dibaca.
sumber
Secara pribadi, menurut saya ini adalah solusi yang lebih bersih dan lebih ringkas:
Kirimkan saja
new
tanggal yang diusulkan ke fungsi ini.sumber