2009-07-16 1 views
8

私はASP.NET MVCのテキストボックスで使用する予定のjQuery UIのdatepickerを持っています。テキストボックスに日付表示がのCultureInfoを経由して、そしてもちろん、ローカライズされた日付ピッカーで正しい日付を選択するためにjqueryので認識する必要があります:私は今やろうとしています何.NET DateTimeFormatInfoをJavascriptに変換するjQuery formatDate?

<%= Html.TextBox("Date", Model.Date.ToString("d", currentCultureInfo), 
    new { @class = "datepicker" })%> 

はDATEFORMATと日付ピッカーを初期化することです等

string jsCode = @"$("".datepicker"").datepicker({ 
    dateFormat: '" + currentCultureInfo.DateTimeFormat.ShortDatePattern + @"', 
});"; 

問題のDateTimeFormatInfoのフォーマット文字列の形式(MSDNリンクを参照) はjQueryの(jQuery formatDate)における書式文字列と完全に異なっていることです。

https://msdn.microsoft.com/en-us/library/system.globalization.datetimeformatinfo.aspx

サンプル(2009年7月16日のようなドイツ語の日付形式):

.NET: 'dd.MM.yyyy' should be converted to 'dd.mm.yy' in jQuery/Javascript 

二つのフォーマットの間で必要な変換を行う方法やライブラリはありますか?

答えて

8

のみ次のコードは、私が必要なものを提供し、変換する必要がありますShortDatePattern場合:

ページへのJavaScriptの
public class wxDateTimeConvert 
{ 
    /// <summary> 
    /// Gets the javascript short date pattern. 
    /// </summary> 
    /// <param name="dateTimeFormat">The date time format.</param> 
    /// <returns></returns> 
    public static string GetJavascriptShortDatePattern(DateTimeFormatInfo dateTimeFormat) 
    { 
     return dateTimeFormat.ShortDatePattern 
      .Replace("M", "m") 
      .Replace("yy", "y"); 
    } 
} 

/// <summary> 
    /// Inserts the localized datepicker jquery code 
    /// </summary> 
    private void InsertLocalizedDatepickerScript() 
    { 

     string dateformat = wxDateTimeConvert.GetJavascriptShortDatePattern(Thread.CurrentThread.CurrentUICulture.DateTimeFormat); 
     String js = @"$(document).ready(function() { 
$("".datepicker"").datepicker({ 
    changeYear: true, 
    dateFormat: '" + dateformat + @"', 
    maxDate: new Date() 
    }); 
});"; 
     this.Page.Header.Controls.Add(
      new LiteralControl("<script type=\"text/javascript\">" + js + "</script>") 
     ); 
    } 

しかし、これは月や日を処理しません名前、時刻書式、またはその他の特別な場合があります。

0

これは完璧な解決策ではないかもしれませんが、始めることができます。 jQueryには日付を扱うためのメソッドはありませんが、JavaScriptにはありません。

解析日

まずそれはあなたは、新しいDateオブジェクトを作成するには、この値を使用し、すべて抽出することができますが、1月1日、1970年からのミリ秒数を含む評価に日付文字列を解析することを可能にする方法Date.parse()を持っていますこのオブジェクトから必要なデータ

var dateString = "Jun 1 2006"; 
var parsedDate = Date.parse(dateString); 
var date = new Date(parsedDate); 

残念ながらDate.parse()はよく2007.03.01のような「点線」の文字列を処理しませんが、そのための解決策にもあります。あなただけのスラッシュですべてのドットを置き換えることができます。

var dateString = "2007.03.01".replace(/\./g, '/'); 

それでもこれはDate.parse()は、.NETが返されますが、場合によっては有用である可能性がある任意の日付フォーマットを理解することはありません。あなたが作成したDateオブジェクトを持っている場合

整形日

は今、あなたは今、あなたが好きな任意の日付形式に変換することができます。これは実際にはかなり簡単です。 JSのPHP日付書式メソッドの実装があります。あなたはそれを見つけることができますhere

スクリプトに追加する場合は、ドキュメントに記載されているトークンを使用して日付をフォーマットすることができます。たとえば、

+0

Askerには既に日付書式設定ライブラリがあります。 AskerはPHPの日付形式を理解するものは必要ありません。 Askerは、.NETの形式に理解/変換できるものが必要です。 –

+0

PHPの日付形式を理解する必要はありません。すべてのスイッチはJSドキュメンテーションの日付形式で説明されています。パーサーがすべての.NETの形式を処理できるかどうかはわかりませんが、この解決策は対応できます。私の最初の文章で言及したように、これは完全な解決策ではなく、より多くのことを作業に取り掛かることができます。 – RaYell

+0

あなたの答えをありがとうが、crescentfreshが言ったように、それは私が必要とするものではありません。しかし、それは別の考え方をするのに役立つかもしれません - ISO形式でjavascriptのDateオブジェクトを準備し、そのオブジェクトを使ってdatepickerを初期化することができます。残念ながら、datepickerによって返された文字列は、別の形式で残っています。したがって、既存の変換ライブラリがない場合、私は自分自身を書く必要があると思います... – mattanja

6

私はまさに同じ問題に遭遇し、以下のコードを思いついた。それは完璧ではありませんが、ほとんどの文化をカバーし、正常に失敗する必要があります。おそらく最短バージョンではないでしょうか?

///======================================================================== 
/// Method : ConvertDateFormat 
/// 
/// <summary> 
/// Takes a culture and returns matching C# and jQuery date format 
/// strings. If possible the C# string will be the ShortDatePattern for 
/// the supplied culture. 
/// </summary> 
///======================================================================== 
private static void GetDateFormats(CultureInfo xiCulture, out string xoCSharpFormat, out string xoJQueryFormat) 
{ 
    //======================================================================= 
    // Start by assigning formats that are hopefully unambiguous in case we 
    // can't do better. 
    //======================================================================= 
    xoCSharpFormat = "yyyy-MM-dd"; 
    xoJQueryFormat = "yy-mm-dd"; 

    if (xiCulture.IsNeutralCulture) 
    { 
    try 
    { 
     xiCulture = CultureInfo.CreateSpecificCulture(xiCulture.Name); 
    } 
    catch 
    { 
     //=================================================================== 
     // Some cultures are neutral and don't have specific cultures. 
     // There's not much we can do here. 
     //=================================================================== 
     return; 
    } 
    } 

    string lCSharpFormat = xiCulture.DateTimeFormat.ShortDatePattern; 

    //======================================================================= 
    // Handle: 
    // C#  jQuery Meaning 
    // d  d  Day of month (no leading 0) 
    // dd  dd  Day of month (leading 0) 
    // M  m  Month of year (no leading 0) 
    // MM  mm  Month of year (leading 0) 
    // yy  y  Two digit year 
    // yyyy yy  Not an exact match but good enough: 
    //     C# means: The year in four or five digits (depending on 
    //     the calendar used), including the century. Pads with 
    //     leading zeros to get four digits. Thai Buddhist and 
    //     Korean calendars have five-digit years. Users 
    //     selecting the "yyyy" pattern see all five digits 
    //     without leading zeros for calendars that have five 
    //     digits. Exception: the Japanese and Taiwan calendars 
    //     always behave as if "yy" is selected. 
    //     jQuery means: four digit year 
    // 
    // Copy '.', '-', ' ', '/' verbatim 
    // Bail out if we find anything else and return standard date format for 
    // both. 
    //======================================================================= 
    StringBuilder lJQueryFormat = new StringBuilder(); 
    bool lError = false; 
    for (int ii = 0; ii < lCSharpFormat.Length; ++ii) 
    { 
    Char lCurrentChar = lCSharpFormat[ii]; 

    switch (lCurrentChar) 
    { 
     case 'd': 
     //================================================================= 
     // d or dd is OK, ddd is not 
     //================================================================= 
     if (ii < (lCSharpFormat.Length - 1) && 
      lCSharpFormat[ii+1] == 'd') 
     { 
      if (ii < (lCSharpFormat.Length - 2) && 
      lCSharpFormat[ii+2] == 'd') 
      { 
      //============================================================= 
      // ddd 
      //============================================================= 
      lError = true; 
      } 
      else 
      { 
      //============================================================= 
      // dd 
      //============================================================= 
      lJQueryFormat.Append("dd"); 
      ii++; 
      } 
     } 
     else 
     { 
      //=============================================================== 
      // d 
      //=============================================================== 
      lJQueryFormat.Append('d'); 
     } 
     break; 
     case 'M': 
     //================================================================= 
     // M or MM is OK, MMM is not 
     //================================================================= 
     if (ii < (lCSharpFormat.Length - 1) && 
      lCSharpFormat[ii + 1] == 'M') 
     { 
      if (ii < (lCSharpFormat.Length - 2) && 
      lCSharpFormat[ii + 2] == 'M') 
      { 
      //============================================================= 
      // MMM 
      //============================================================= 
      lError = true; 
      } 
      else 
      { 
      //============================================================= 
      // MM 
      //============================================================= 
      lJQueryFormat.Append("mm"); 
      ii++; 
      } 
     } 
     else 
     { 
      //=============================================================== 
      // M 
      //=============================================================== 
      lJQueryFormat.Append('m'); 
     } 
     break; 
     case 'y': 
     //================================================================= 
     // yy or yyyy is OK, y, yyy, or yyyyy is not 
     //================================================================= 
     if (ii < (lCSharpFormat.Length - 1) && 
      lCSharpFormat[ii + 1] == 'y') 
     { 
      if (ii < (lCSharpFormat.Length - 2) && 
      lCSharpFormat[ii + 2] == 'y') 
      { 
      if (ii < (lCSharpFormat.Length - 3) && 
       lCSharpFormat[ii + 3] == 'y') 
      { 
       if (ii < (lCSharpFormat.Length - 4) && 
       lCSharpFormat[ii + 4] == 'y') 
       { 
       //========================================================= 
       // yyyyy 
       //========================================================= 
       lError = true; 
       } 
       else 
       { 
       //========================================================= 
       // yyyy 
       //========================================================= 
       lJQueryFormat.Append("yy"); 
       ii = ii + 3; 
       } 
      } 
      else 
      { 
       //=========================================================== 
       // yyy 
       //=========================================================== 
       lError = true; 
      } 
      } 
      else 
      { 
      //============================================================= 
      // yy 
      //============================================================= 
      lJQueryFormat.Append("y"); 
      ii++; 
      } 
     } 
     else 
     { 
      //=============================================================== 
      // y 
      //=============================================================== 
      lError = true; 
     } 
     break; 
     case '.': 
     case '-': 
     case ' ': 
     case '/': 
     lJQueryFormat.Append(lCurrentChar); 
     break; 
     default: 
     lError = true; 
     break; 
    } 

    if (lError) 
    { 
     break; 
    } 
    } 

    //======================================================================= 
    // If we didn't get an error return the culture specific formats 
    //======================================================================= 
    if (!lError) 
    { 
    xoCSharpFormat = lCSharpFormat; 
    xoJQueryFormat = lJQueryFormat.ToString(); 
    } 
} 
+0

さて、ありがとうコードです...私はいくつかの同様の変換コードを書くことを考えてきましたが、今のところ私はちょうど両側でISO日付形式を使用しています。私は今あなたのクラスを使用すると思います。 – mattanja

+0

コードを詳しく見てみると、あまりにも複雑すぎるようです。複雑な処理を使用すると、すべてのケース(月の名前や曜日の名前など)が処理される場合にのみ正当化されます。 提供されたコードはShortDatePatternだけを扱うので、私の答えで提供される文字列置換コードは4行でほぼ同じになります。または、あなたのコードのポイントを見逃しましたか? – mattanja

+0

これはかなり守備的で、将来的にはそれを拡張することに目を向けています(ただし、jQueryとMSのフォーマット文字列が重複しているとは限りません)。マイクロソフトでは、dddやMMMなどの新しい文字を使用する短い日付形式を追加する(おそらくほとんどない)というケースでは、単純なコードでは余分な文字が残り、代わりに既定の形式が使用されます。 私はMMを取り除くことによってコードをさらに短縮できると思いますか? – Dan

1

私はこれが最も簡単な方法だと思います...

string dateFormat = currentCultureInfo.DateTimeFormat.ShortDatePattern.Replace("MM", "mm"); 
string jsCode = @"$("".datepicker"").datepicker({ 
    dateFormat: '" + dateFormat + @"', 
});"; 
+0

年の形式はどうですか?しかし、ええ、あなたが年形式の置換えを追加する場合、これはダンの答えよりもずっと簡単です。 – mattanja

2

これを使用して、datetime形式の.netをjQueryに変換します。ダンの答えに大まかに基づいています。

/// <summary> 
/// Convert a .net date format to jQuery 
/// </summary> 
/// <param name="sFormat"></param> 
/// <returns></returns> 
private string ConvertDateFormatToJQuery(string sFormat) 
{ 
    if (string.IsNullOrEmpty(sFormat)) 
    { 
     return null; 
    } 

    StringBuilder sbOutput = new StringBuilder(""); 
    string sDatePartChars = "dDmMyY"; 

    char cLast = sFormat[0]; 
    StringBuilder sbDatePart = new StringBuilder(""); 

    //Loop through char by char, extracting each date part or whitespace/seperator into individual components, and convert each component as we go 
    foreach (char c in sFormat) 
    { 
     //Whitespace, or seperator 
     if (sDatePartChars.IndexOf(c) == -1) 
     { 
      //If there is a currently extracted date part, convert 
      sbOutput.Append(ConvertDatePartToJQuery(sbDatePart.ToString())); 
      sbDatePart.Clear(); 

      //Whitespace or serator, just append to output 
      sbOutput.Append(c.ToString()); 

      cLast = c; 
     } 
     else if (c.Equals(cLast)) 
     { 
      //Same date part, extract it 
      sbDatePart.Append(c.ToString()); 
     } 
     else 
     { 
      //We've come to the beginning of a new date part, convert the currently extracted date part 
      sbOutput.Append(ConvertDatePartToJQuery(sbDatePart.ToString())); 

      sbDatePart.Clear(); 
      sbDatePart.Append(c.ToString()); 
      cLast = c; 
     } 
    } 
    //Convert any remaining date part 
    sbOutput.Append(ConvertDatePartToJQuery(sbDatePart.ToString())); 
    return sbOutput.ToString(); 
} 

/// <summary> 
/// Converts a date part (month,day,year) to JQuery format. Unrecongized formats will just pass through 
/// </summary> 
/// <param name="sDatePart"></param> 
/// <returns></returns> 
private string ConvertDatePartToJQuery(string sDatePart) 
{ 
    //======================================================================= 
    // Handle: 
    // C#  jQuery Meaning 
    // d  d  Day of month (no leading 0) 
    // dd  dd  Day of month (leading 0) 
    // ddd D  Day name short 
    // dddd DD  Day name long 
    // M  m  Month of year (no leading 0) 
    // MM  mm  Month of year (leading 0) 
    // MMM M  Month name short 
    // MMMM MM  Month name long 
    // yy  y  Two digit year 
    // yyyy yy  Four digit year 
    //======================================================================= 

    string sJQueryDatePart = ""; 
    //We've come to the beginning of a new date part, convert the currently extracted date part 
    if (!string.IsNullOrEmpty(sDatePart)) 
    { 
     if (sDatePart[0] == 'M') 
     { 
      if (sDatePart.Length == 1) //Month, no leading 0 
      { 
       sJQueryDatePart = "m"; 
      } 
      else if (sDatePart.Length == 2) //Month, leading 0 
      { 
       sJQueryDatePart = "mm"; 
      } 
      else if (sDatePart.Length == 3) //Month, short name 
      { 
       sJQueryDatePart = "M"; 
      } 
      else if (sDatePart.Length == 4) //Month, long name 
      { 
       sJQueryDatePart = "MM"; 
      } 
      else 
      { 
       //invalid, just leave it 
       sJQueryDatePart = sDatePart; 
      } 
     } 
     else if (sDatePart[0] == 'd') 
     { 
      if (sDatePart.Length == 1) //Day, no leading 0 
      { 
       sJQueryDatePart = "d"; 
      } 
      else if (sDatePart.Length == 2) //Day, leading 0 
      { 
       sJQueryDatePart = "dd"; 
      } 
      else if (sDatePart.Length == 3) //Day, short name 
      { 
       sJQueryDatePart = "D"; 
      } 
      else if (sDatePart.Length == 4) //Day, long name 
      { 
       sJQueryDatePart = "DD"; 
      } 
      else 
      { 
       //invalid, just leave it 
       sJQueryDatePart = sDatePart; 
      } 
     } 
     else if (sDatePart[0] == 'y') 
     { 
      if (sDatePart.Length <= 2) //Year, two digit 
      { 
       sJQueryDatePart = "y"; 
      } 
      else if (sDatePart.Length > 2) //Year four digit 
      { 
       sJQueryDatePart = "yy"; 
      } 
      else 
      { 
       //invalid, just leave it 
       sJQueryDatePart = sDatePart; 
      } 
     } 
     else 
     { 
      //invalid, just leave it 
      sJQueryDatePart = sDatePart; 
     } 
    } 
    return sJQueryDatePart; 
} 
関連する問題