Gg / aa / yyyy: Avusturalya'da strtotime ayrıştırma tarihleri ​​(yani İngiltere) biçimi nasıl yapılır?

5 Cevap php

Ben daha önce bu bir rastlamak hiç inanmak olamaz.

Temelde, ben insan oluşturulan metin belgeleri metni ayrıştırma ve ben ayrıştırmak için gereken alanlardan biri bir tarih ve zamandır. Ben Avustralya'da olduğum için, tarih dd/mm/yyyy gibi biçimlendirilir fakat strtotime sadece bir ABD biçimlendirilmiş tarihi olarak ayrıştırmak istiyor. Ben Ayrıca, belirtildiği gibi / işe gitmiyor ile patlayan, bu belgeler el-daktilo ve bunlardan bazıları d M yy biçimini alır, çünkü.

I setlocale birden kombinasyonları denedim ama deneyin ne olursa olsun, dili her zaman ABD İngilizcesi ayarlanır.

Ben setlocale anahtarı burada oldukça eminim, ama ben doğru kod üzerine grev mümkün görünmüyor. Bu çalıştı:

  • au
  • au-tr
  • en_AU
  • Avustralya
  • aus

Ben deneyebilirsiniz başka bir şey?

Açıklık için: Ben Windows kutusu ile IIS üzerinde koşuyorum.

Çok teşekkürler :)

Iain

Örnek:

$mydatetime = strtotime("9/02/10 2.00PM");
echo date('j F Y H:i', $mydatetime);

Üretir

2 September 2010 14:00

Ben bunu üretmek istiyorum:

9 February 2010 14:00

My solution

Ben bu benim için çok daha kolay okunur bir çözüm olarak burada cevapları birine kene vererek, ama burada ben ile geldim ne kulüpler:

$DateTime = "9/02/10 2.00PM";
$USDateTime = preg_replace('%([0-3]?[0-9]{1})\s*?[\./ ]\s*?((?:1[0-2])|0?[0-9])\s*?[./ ]\s*?(\d{4}|\d{2})%', '${2}/${1}/${3}', $DateTime);  
echo date('j F Y H:i',strtotime($USDateTime));

Ben onların tarih girişi ile tutarlı olması için kullanıcılar güvenemez Çünkü, benim regex biraz daha karmaşık yaptık:

  • 0 ile 3 arasında, 0 ya da 1 basamak
  • 0 ve 9 arasında 1 basamak - evet, bu geçerli bir tarih olarak 37 maç olacak ama ben regex zaten yeterince büyük olduğunu düşünüyorum!
  • Bazı boşluk olabilir
  • Sınırlayan karakter (bir '.', Bir '/' veya ')
  • Bazı boşluk olabilir
  • Either:
    • 10 ve 12 arasında bir sayı veya
    • Isteğe bağlı bir lider 0 ile 1 ile 9 arasında bir sayı
  • Bazı boşluk olabilir
  • Sınırlayan karakter (bir '.', Bir '/' veya ')
  • Bazı boşluk olabilir
  • Either:
    • 2 basamaklı uzun VEYA sayı
    • 4 basamak uzunluğunda bir sayı

Umarım bu tarihi yazının en stilleri maç olacak ...

5 Cevap

Ben başlamak için iyi bir yer here olacağını düşünüyorum.

There's a quick fix that seems to force PHP's strtotime into using the UK date format. That is: to replace all of the '/' in the incoming string with a '-'.

Örnek:

date('Y-m-d', strtotime('01/04/2011'));

Üretecek: 2011-01-04

date('Y-m-d', strtotime('01-04-2011'));

Üretecek: 2011-04-01

Sen str_replace bunu başarmak için kullanabilirsiniz.

Örnek:

str_replace('/', '-', '01/04/2011');

EDIT:

Açıklamalarda belirtildiği gibi PHP Amerika ve Avrupa gibi noktalar / tireler bölü yorumlaması nedeniyle, bu işleri.

Ben kapsamlı bu numara kullanılmaktadır ve şimdiye kadar hiçbir sorun yaşadım.

Herkes bu kullanmak için herhangi bir iyi nedenler varsa, yorum lütfen.

Sorun strtotime bir format argüman almaz olmasıdır. Peki strptime?

setlocale () açıkladığınız tam nedenle berbat: Sen almak için gidiyoruz biliyorum asla. Elle dize işlemek için iyi.

Zend Framework adlı Zend_Date daha kesin ve tutarlı bir tarih kullanımı umut verici bir alternatif olduğunu. Kendimi onunla deneyime sahip değilseniz, sadece onunla çalışmaya başlayan, ancak bugüne kadar, ben bunu sevmiyorum.

Ah, bizi şanslı Avustralyalı eski bir sorun olsun.

Ne geçmişte yaptık böyle bir şeydir

public static function getTime($str) { // 3/12/2008

       preg_match_all('/^(\d{1,2})\/(\d{1,2})\/(\d{4})$/', $str, $matches);

       return (isset($matches[0][0])) ? strtotime($matches[3][0] . '-' . $matches[2][0] . '-' . $matches[1][0]) : NULL;

    }

Bu formatta tarihlerde dayanır dd/mm/yyyy. Rağmen

Muhtemelen başka bir regex kullanabilir veya böylece d M yy dönüştürmek ya da değiştirilmiş bir birini kullanmak. Bu doğru olurdu bilmiyorum ama bu bir başlangıç ​​olabilir:

/^(\d{1,2})(?:\/|\s)(\d{1,2})(?:\/|\s)(\d{2,4})$/