【问题标题】:Change date&time format in date picker SSRS更改日期选择器 SSRS 中的日期时间格式
【发布时间】:2016-07-05 11:27:06
【问题描述】:

如何更改报告服务的日期和时间选择器的格式。当前始终为 dd/MM/yyyy 格式,系统日期和时间格式相同。我想将日期更改为 MM/dd/yyyy 格式

【问题讨论】:

    标签: reporting-services


    【解决方案1】:

    在您的设计器中,日期格式由操作系统的文化决定。

    部署后,日期格式由浏览器的语言决定。

    【讨论】:

      【解决方案2】:

      死灵法。
      是的,你可以确实做到这一点 - 有点。
      首先,请注意 SSRS 采用浏览器中指定语言的日期格式。

      因此,您只需更改浏览器的语言即可。
      显然,您不想告诉每个用户都这样做(如果他们一开始就有这样做的权利和技能)。

      因此,您将一个附加参数传递到您的报告中:
      我称它为 in_sprache(Sprache 在德语中的意思是语言,可能的值是“DE”、“FR”、“IT”、“EN”)。

      现在您需要更改本地化过程,方法是覆盖 ReportViewer.aspx 中的虚拟方法“InitializeCulture”。

      您可以在

      中找到ReportViewer
      C:\Program Files\Microsoft SQL Server\MSRS<Version>.MSSQLSERVER
      C:\Program Files\Microsoft SQL Server\MSRS<Version>.<Instance>
      

      例如

      C:\Program Files\Microsoft SQL Server\MSRS10_50.MSSQLSERVER
      

      您在此处添加(在 /ReportServer/Pages/ReportViewer.aspx 的源代码中):

      <script type="text/C#" runat="server">
      
      protected override void InitializeCulture()
      {
          string sprache = System.Web.HttpContext.Current.Request.QueryString["in_sprache"];
      
          if(string.IsNullOrEmpty(sprache))
              sprache = "";
      
          switch(sprache.ToLowerInvariant())
          {
              case "de":
                  sprache = "de-CH";
                  break;
              case "fr":
                  sprache = "fr-CH";
                  break;
              case "it":
                  sprache = "it-CH";
                  break;
              case "en":
                  sprache = "en-US";
                  break;
              default:
                  sprache = "";
                  break;
          }
      
          // System.Web.HttpContext.Current.Response.Write(sprache);
          if(!String.IsNullOrEmpty(sprache))
          {
              System.Threading.Thread.CurrentThread.CurrentCulture = System.Globalization.CultureInfo.CreateSpecificCulture(sprache);
              System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo(sprache);
          }
      
          base.InitializeCulture();
      }
      
      </script>
      

      这将覆盖 ASP.NET 本地化的方式,采用 url 参数 in_sprache 的值(in_sprache 必须是您的报告的参数)而不是浏览器用户语言。

      现在,不幸的是,您还必须覆盖 context.Request.UserLanguages 才能使日期选择器正常工作...(否则,如果文化为 en-US 且 day > 12,则会出现错误)
      您只能通过添加 HTTP 模块 (libRequestLanguageChanger.dll)
      进入 ReportServer 的 web.config

        <system.web>
          [...]
          <httpModules>
            [...]
            <add name="RequestLanguageChanger" type="libRequestLanguageChanger.RequestLanguageChanger, libRequestLanguageChanger" />
      
          </httpModules>
          [...]
        </system.web>
      

      。 (需要将信任级别从 rosetta 更改为“Full”,除非您知道如何更改 rosetta-policy 以允许此 http 模块)。

      由于我们还可以在 HTTP-Module 中覆盖 InitializeCulture,因此您实际上不必将 runat="server" 脚本添加到 ReportViewer.aspx。

      namespace libRequestLanguageChanger
      {
      
      
          public class RequestLanguageChanger : System.Web.IHttpModule
          {
      
      
              void System.Web.IHttpModule.Dispose()
              {
                  // throw new NotImplementedException();
              }
      
      
              void System.Web.IHttpModule.Init(System.Web.HttpApplication context)
              {
                  // https://stackoverflow.com/questions/441421/httpmodule-event-execution-order
                  context.BeginRequest += new System.EventHandler(context_BeginRequest);
              }
      
      
              void context_BeginRequest(object sender, System.EventArgs e)
              {
                  System.Web.HttpApplication application = sender as System.Web.HttpApplication;
                  System.Web.HttpContext context = application.Context;
      
                  if (context.Request != null)
                  {
                      // string language = context.Request.Headers["Accept-Language"];
                      string language = null;
                      // string url = context.Request.RawUrl;
                      // string referrer = null;
      
      
                      if (context.Request.UrlReferrer != null)
                      {
                          // referrer = context.Request.UrlReferrer.OriginalString;
      
                          string queryString = context.Request.UrlReferrer.Query;
                          System.Collections.Specialized.NameValueCollection queryStrings = System.Web.HttpUtility.ParseQueryString(queryString);
                          language = queryStrings["in_sprache"];
                      }
      
                      if(context.Request.QueryString["in_sprache"] != null)
                          language = context.Request.QueryString["in_sprache"];
      
                      if (!string.IsNullOrEmpty(language))
                      {
                          language = language.ToLowerInvariant();
      
                          switch (language)
                          {
                              case "de":
                                  language = "de-CH";
                                  break;
                              case "fr":
                                  language = "fr-CH";
                                  break;
                              case "it":
                                  language = "it-CH";
                                  break;
                              case "en":
                                  language = "en-US";
                                  break;
                              default:
                                  language = "";
                                  break;
                          }
      
                      } // End if (!string.IsNullOrEmpty(sprache)) 
      
                      // SQL.Log(url, referrer, sprache);
      
      
                      // Simulate Browser-Language = in_sprache 
                      if (!string.IsNullOrEmpty(language))
                      {
                          // context.Request.Headers["Accept-Language"] = language;
      
                          System.Globalization.CultureInfo culture = new System.Globalization.CultureInfo(language);
                          System.Threading.Thread.CurrentThread.CurrentCulture = culture;
                          System.Threading.Thread.CurrentThread.CurrentUICulture = culture;
      
                          if (context.Request.UserLanguages != null)
                          {
      
                              // System.Globalization.CultureInfo culture = new System.Globalization.CultureInfo(context.Request.UserLanguages[0]); 
                              for (int i = 0; i < context.Request.UserLanguages.Length; ++i)
                              {
                                  // context.Request.UserLanguages[i] = "en-US";
                                  context.Request.UserLanguages[i] = language;
                              } // Next i 
      
                          } // End if (context.Request.UserLanguages != null)
      
                      } // End if (!string.IsNullOrEmpty(language)) 
      
                  } // End if (context.Request != null) 
      
      
              } // End Sub context_BeginRequest 
      
      
          } // End Class 
      
      
      } // End Namespace 
      

      您就是这样,具有“自定义”文化日期格式的 ReportServer,无需告诉用户更改浏览器语言。

      您可以从 SQL 表中获取链接,您可以在其中将文本 {@language} 替换为您的用户的文化名称(在我的情况下为 DE、FR、IT、EN,因为这些是使用的语言瑞士)。

      SELECT 
          REPLACE(RE_Link, '{@language}', T_Users.USR_Language) 
      FROM T_Reports 
      LEFT JOIN T_Users ON USR_ID = @usr 
      
      
      -- http://localhost/Reportserver?/SomeCompany/SomeReport&rs:Command=Render&in_sprache=de
      -- http://localhost/Reportserver?/SomeCompany/SomeReport&rs:Command=Render&in_sprache=fr
      -- http://localhost/Reportserver?/SomeCompany/SomeReport&rs:Command=Render&in_sprache=it
      -- http://localhost/Reportserver?/SomeCompany/SomeReport&rs:Command=Render&in_sprache=en
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-06-25
        • 2013-11-28
        • 1970-01-01
        • 1970-01-01
        • 2017-03-24
        相关资源
        最近更新 更多