2012-10-03 22 views
1

我使用下面的链接的代码来处理元数据字段: -如何为日期或数字类型的元数据字段赋值?

https://code.google.com/p/tridion-practice/wiki/ChangeContentOrMetadata

但是当我尝试值赋给日期类型,然后我得到下面的XML验证错误的元数据字段: -

“ System.ServiceModel.FaultException`1 [myPorject.serviceReference.CoreServiceFault]:XML validation error。原因:'uuid:myUUID:dateField'元素无效 - 值为'10/4/2012 03:04: 00 AM'根据其数据类型'http://www.w3.org/2001/XMLSchema:dateTime'无效 - 字符串'10/4/2012 03: 04:00 AM'不是有效的日期时间值..(错误详细信息等于 myPorject.serviceReference.CoreServiceFault)“

不管我是否将值赋值为字符串或DateTime数据类型,我都得到相同的错误,我也试图用Datetime数据类型重载AddValue方法,但目前为止没有任何工作。

方法的AddValue的代码片段: -

 public void AddValue(string value1) 
    { 
     string value = string.IsNullOrEmpty(value1) ? null : value1; ; 
     XmlElement newElement = fields.AddFieldElement(definition); 
     if (value != null) newElement.InnerText = value; 
    } 

请建议的日期和数字数据类型的解决方案。在此先感谢

回答

0

经过一些故障排除后,我终于解决了问题,并与日期的格式一起。为此,我需要将本地计算机的时区与服务器的时区相匹配。

及以下重载方法的代码: -

 public void AddValue(DateTime value1) 
    { 
     DateTime value = value1 == null ? DateTime.MinValue : value1; 

     XmlElement newElement = fields.AddFieldElement(definition); 
     if (value != null) newElement.InnerText = value.ToString("yyyy-MM-ddThh:mm:ss"); 
    } 
+1

你只需要确保你指定的时间在服务器的时区。这样做的一种方法是将本地机器设置为与服务器相同的时区,但绝对有其他方法(例如,执行一些简单的时区数学运算),不需要您更改机器设置。 –

2

根据我的C#经验,这种错误是由于日期时间格式问题。 你可以试试下面的代码

DateTime.Now.ToUniversalTime().ToString("yyyy-MM-dd"); 

我没有你的代码测试,但希望它会在你的情况下工作。

+0

不,这是不注日期的格式有关的,我已经尝试过这一点。 –

+0

@Ram:我通常使用'datetime.ToString(“u”)。替换(“”,“T”)。替换(“Z”,“”)'以获得正确格式的日期。 –

+0

感谢Frank的知识增加:-) –

5

日期字符串应该具有像格式:

  • YYYY-MM-DDTHH:MM:SS

实施例:

  • “2012-10-03T09 :39:43“

在ad dition到,要设置日期的方式似乎有点复杂,我,因为你正在使用的内容和元数据封装,为什么不能是这样的:

string myStringDate = "2012-10-03T09:39:43"; 
fields["DateFieldName"].Value = myStringDate; 
component.Metadata = fields.ToString(); 
+0

我认为这个问题与日期的格式无关,因为如果我手动创建多媒体元件并预览其元数据字段,那么日期字段的值为“mm/d/yyyy h :MM:ss tt“例如: - 2012年10月9日下午5点11分54秒但如果我尝试以这种格式分配日期,那么即使我得到相同的例外。 –

+2

预览以不同格式显示日期的事实来自您的模板代码以该格式输出的事实。在内部,它以“T”而不是空格并以24小时格式存储,而不是“AM/PM”。只要尝试Puntero的代码,你会发现他毕竟是对的。 –

1

你缺少的“T”分离器在你的格式中的日期和时间之间。您确实提到了输出的日期格式是您要重新插入的格式,但无论如何输出都可以格式化,而不一定是您必须指定日期的方式。

有着密切的读取到XMLSchema的日期时间规范在这里:http://www.w3.org/TR/xmlschema-2/#dateTime

6

的错误信息是非常明确的事实,你的日期格式是错误的:The string '10/4/2012 03:04:00 AM' is not a valid DateTime value

Tridion期望的格式是YYYY-MM-DDThh:mm:ss,所以没有空间,没有时区,也没有AM/PM标记。

在官方Tridion API中,您通常不必亲自进行转换,因为它们接受DateTime对象并将其转换为适合您的格式。但是由于您使用的帮助程序类不是官方API,因此需要一些快捷方式,并将值设置为string

我通常使用datetime.ToString("u").Replace(" ", "T").Replace("Z", "")以正确格式获取日期。

+2

datetime.ToString(“yyyy-MM-ddTHH:mm:ss”) –

+0

但我真的很喜欢那种魔术**“u”**在我的变体中。它会发送那些阅读API文档运行的代码 - 或者只是在我的想象中? ;-) –

相关问题