Ngày định dạng PHP từ chuỗi

Hầu hết các ứng dụng php cần phân tích ngày tháng và chuyển đổi chúng thành dấu thời gian chẳng hạn. Phân tích cú pháp cũng cần thiết để chuyển đổi ngày thành định dạng chuẩn hơn như yyyy-mm-dd có thể được lưu trữ trong cơ sở dữ liệu như mysql

Cơ sở dữ liệu Mysql lưu trữ ngày ở định dạng yyyy-mm-dd như 2009-04-15. Tuy nhiên, con người đã quen với các định dạng như dd-mm-yyyy hoặc mm-dd-yyyy [e. g. 21-04-2009]. Vì vậy, khi người dùng điền vào biểu mẫu, họ sẽ không nhập ngày ở định dạng yyyy-mm-dd mà ở một trong các định dạng khác. Ứng dụng có trách nhiệm chuyển đổi ngày thành định dạng iso và lưu trữ chính xác

Để ứng dụng phân tích cú pháp ngày chính xác, điều quan trọng là ứng dụng phải biết người dùng đang nhập ngày ở định dạng nào. Hầu hết các ứng dụng tốt sẽ cung cấp cho người dùng tùy chọn cấu hình để chọn định dạng sẽ sử dụng. Dưới đây là một số ví dụ phổ biến

dd-mm-yy
dd-mm-yyyy
mm-dd-yy
mm-dd-yyyy

Thay cho dấu gạch ngang, người dùng có thể nhập dấu chấm [. ] hoặc dấu gạch chéo lên [/] chẳng hạn. Vì vậy, ứng dụng cũng cần quản lý điều đó

Vì vậy, về cơ bản, đó là ý tưởng đằng sau việc phân tích ngày tháng. Bây giờ chúng ta hãy xem làm thế nào điều này có thể được thực hiện trong php

Chuyển đổi định dạng người dùng sang định dạng yyyy-mm-dd

strptime

Hàm strptime có thể được sử dụng để phân tích cú pháp và trích xuất các phần của một ngày theo một định dạng nhất định. Đây là một ví dụ nhanh

$format = '%d-%m-%Y';
$date = '25-05-2012';
$parsed = strptime[$date , $format];

print_r[$parsed];

Trong ví dụ trên, định dạng của ngày và chuỗi ngày được cung cấp và strptime phân tích nó. Đầu ra sẽ là một mảng như thế này

Array
[
    [tm_sec] => 0
    [tm_min] => 0
    [tm_hour] => 0
    [tm_mday] => 25
    [tm_mon] => 4
    [tm_year] => 112
    [tm_wday] => 5
    [tm_yday] => 145
    [unparsed] => 
]

tm_mday là ngày của ngày, tm_mon là tháng của ngày và tm_year là năm của ngày trừ đi 1900. Vì vậy, để tạo ngày của chúng tôi ở định dạng tiêu chuẩn, chúng tôi chỉ cần nối lại chúng

$format = '%d-%m-%Y';
$date = '25-05-2012';
$parsed = strptime[$date , $format];

if[is_array[$parsed]]
{
	$y = [int]$parsed['tm_year'] + 1900;
	
	$m = [int]$parsed['tm_mon'] + 1;
	$m = sprintf["%02d", $m];
	
	$d = [int]$parsed['tm_mday'];
	$d = sprintf["%02d", $d];
	
	$iso_date = "$y-$m-$d";
}

echo $iso_date; //outputs 2012-05-25

Nếu strptime không phân tích được ngày [điều này sẽ xảy ra nếu ngày nhập sai] thì nó sẽ trả về false. Điều này có thể được sử dụng để xác minh xem ngày do người dùng nhập có phải là ngày hợp lệ hay không. Định dạng được sử dụng bởi strptime để chỉ định định dạng ngày giống với định dạng được sử dụng bởi strftime và khác với định dạng được sử dụng bởi hàm date[]

Ngày giờ. tạoFromFormat

Php 5. 3 trở đi, có một lớp hữu ích gọi là DateTime có chức năng createFromFormat có thể được sử dụng để thực hiện phân tích ngày tháng. Nó có một cú pháp đơn giản hơn

$format = 'd-m-Y';
$date = '25-05-2012';

$date = DateTime::createFromFormat[$format , $date];
echo $date->format['Y-m-d'];

Đơn giản và nhanh chóng. Lớp DateTime cũng có các hàm thủ tục

$format = 'd-m-Y';
$date = '25-05-2012';

$date = date_create_from_format[$format, $date];
echo date_format[$date, 'Y-m-d'];

Tài liệu php nói

Internally, this function calls the strptime[] function provided by the system's C library. This function can exhibit noticeably different behaviour across different operating systems. The use of date_parse_from_format[], which does not suffer from these issues, is recommended on PHP 5.3.0 and later.

Kiểm tra xem ngày có hợp lệ không

Kiểm tra tính hợp lệ của ngày tháng nghĩa là kiểm tra xem các giá trị ngày, tháng, năm có đúng định dạng hay không. Chức năng tốt nhất để kiểm tra tính hợp lệ là checkdate

Hàm checkdate cũng xử lý cả năm nhuận. Đây là một ví dụ nhanh

list[$d,$m,$y] = explode['-', $date];

if[checkdate[$m, $d, $y]]
{
    return true;
}

ngày kiểm tra mất nhiều năm trong phạm vi từ 1 đến 32767. Tuy nhiên, cách tiếp cận trên có một vấn đề. Nó giả sử định dạng của ngày là d-m-Y. Định dạng có thể khác nhau tùy thuộc vào sự lựa chọn của người dùng

Kiểm tra năm nhuận

Đây là một hàm nhanh để biết một năm có nhuận hay không

________số 8_______

Nhưng một vấn đề nhỏ với ngày kiểm tra là nó báo cáo một ngày như 01-01-2500 lại hợp lệ [nghĩa là, theo những gì ngày kiểm tra phải làm]

lớp ngày giờ

Lớp DateTime có thể được sử dụng để kiểm tra xem một ngày có hợp lệ hay không. Nhưng có một sự thay đổi. Lớp DateTime sẽ tạo một đối tượng hợp lệ của các ngày như 40-08-2012. Đối với những ngày như vậy, đối tượng được tạo có ngày trùng với 40 ngày kể từ đầu tháng thứ 8. Vì vậy, mẹo là chuyển đổi ngày thành một đối tượng và định dạng lại thành định dạng giống như đã chỉ định rồi so sánh 2 chuỗi

Đây là một ví dụ

/**
	Check if date is valid or not
*/
function is_valid_date[$date, $format = 'd-m-Y']
{
	// string -> object -> string
	$ob = date_create_from_format[$format, $date];
	$date2 = date_format[$ob, $format];

	// compare the strings, if they match, then the date was valid
	if[$date2 != $date]
	{
		return false;
	}

	return true;
}

var_dump[is_valid_date['25-02-1903']];
var_dump[is_valid_date['05-02-1903' , 'm-d-Y']];

Vì vậy, đối với những ngày như 40-08-2012, ngày được tạo lại sẽ giống như ngày 10-09-2012 và nó sẽ không khớp với ngày trước đó và do đó có thể nói rằng ngày đầu vào trước đó là không hợp lệ

Nhưng chức năng trên thiếu linh hoạt. Ví dụ: nó sẽ báo cáo 25-5-2012/d-m-Y là không hợp lệ, vì ngày được tạo lại sẽ giống như 25-05-2012 không khớp với 25-5-2012 khi thực hiện so sánh chuỗi
Để khắc phục điều này, bạn cần so sánh bằng cách sử dụng nhiều định dạng định dạng thay thế và xem liệu nó có khớp với bất kỳ định dạng đã cho nào trong một tập hợp nhất định hay không

strptime/strftime

Phương pháp xác thực ngày ở trên có thể được thực hiện bằng cách sử dụng strptime, strtotime và strftime cùng nhau. Đây là một ví dụ nhanh

$format = '%d-%m-%Y';
$date = '25-05-2012';
$parsed = strptime[$date , $format];

print_r[$parsed];
0

Một điều quan trọng cần nhớ về strtotime là nó bị ảnh hưởng nặng nề bởi bit-ness của hệ thống hoặc kích thước số nguyên. Vì vậy, nó sẽ cho kết quả khác nhau trên máy 32 bit và 64 bit

định dạng ngày

Định dạng cho mysql

Sử dụng strptime để chuyển đổi một ngày ở định dạng dd-mm-yyyy thành yyyy-mm-dd, mã có thể là

$format = '%d-%m-%Y';
$date = '25-05-2012';
$parsed = strptime[$date , $format];

print_r[$parsed];
1

Hàm trên sẽ chuyển đổi một ngày ở định dạng dd-mm-yyyy thành yyyy-mm-dd

$format = '%d-%m-%Y';
$date = '25-05-2012';
$parsed = strptime[$date , $format];

print_r[$parsed];
2

Bây giờ $date đã sẵn sàng để chèn vào cơ sở dữ liệu mysql

$format = '%d-%m-%Y';
$date = '25-05-2012';
$parsed = strptime[$date , $format];

print_r[$parsed];
3

Trong khi in ngày trong bảng để xem mục đích, một định dạng như 02-Mar-2010 có thể dễ dàng đọc được và chức năng trên cũng làm như vậy. Nó chuyển đổi 2010-03-02 thành 02-Mar-2010

Khi nhập ngày tháng vào mẫu 23-02-2010 được ưu tiên nhất. Hàm bên dưới sẽ chuyển đổi một ngày ở định dạng yyyy-mm-dd thành dd-mm-yyyy

Làm cách nào để định dạng ngày chuỗi trong PHP?

Chúng ta có thể đạt được chuyển đổi này bằng cách sử dụng hàm strtotime[] và date[]. Đây là các hàm có sẵn của PHP. .

Chủ Đề